Home
User Manual
Contents
1. e 17 10 1 Changing Priority Explicitly o o e 17 10 2 Choice of Priorities a 17 11Details of the Execution Mechanism 2 2 a 17 11 1 Particularities of Waking by Unification 17 11 2 Cuts and Suspended Goals 2 0 ee 17 12Simulating other System s Delay Primitives 0 18 More About Suspension 18 1 Waiting for Instantiation 2 2 ee 18 2 Waiting for Binding escote Ad Be op aS Pe a a 18 3 Waiting for other Constraints a a 19 Memory Organisation And Garbage Collection LOUD Introd uctiOnies 28 4 6 A Sete tered Ge a eke A ee eat eh gah Gees Soo 19 1 1 The Shared Private Heap boy e Geek 2 Math he Sha ah et Ae 19112 The Local Stack ceso a aw A ate alk ee eS Gods ee Bl Sie a 19 1 3 The Control Stack e E a a a a a e ea a 19 14 The GlobaliStack siii A Bt a cd he a N vi 165 165 165 165 166 166 167 167 169 171 171 174 175 176 176 176 177 177 178 178 179 179 179 180 180 181 181 181 183 183 185 185 187 193 19175 The Trail Stacks 02 a a a Ba REDE ate ie e 200 19 2 Garbage collection ee 200 20 Operating System Interface 203 2071 Introductio a h s a e026 432 ia pa Ro e a e e 203 20 2 Environment Access a a a oE pa ee 203 20 2 1 Command Line Arguments 20 0000 0 eee 203 20 2 2 Environment Variables 2 0 200000 ee ee 203 20 23 Beane POU PS 4 6 duo A A
2. suspend m Var 3 trigger monvar event_after_every monvar 1 demon m 1 m Var writeln Var monitor Var lt do_something gt Note the need to declare m 1 as a demon otherwise once m 1 is woken up once it will disappear from the resolvent and the next monvar event will not have a suspended m 1 to wake up Note also that it is necessary to connect the event machanism to the waking mechanism by setting the event handler to trigger 1 13 1 4 Aborting an Execution with Events Typically event handlers would perform some action and then succeed letting the interrupted exectuion continue unharmed Event handlers for asynchronous events should never fail be 1This is time that the CPU spends on executing user code i e the ECL PS program 110 cause the failure will be inserted in a random place in resolvent and the effect will be unpre dictable It is however sometimes useful to allow an asynchronous event to abort an execution via exit_block 1 e g to implement timeouts When dealing with events that occur asynchronously in particular after events and event handlers that cause the execution to abort it is often a problem that event handlers may be interrupted or preempted by other event handlers This can be avoided by use of the event defer mechanism Events can be declared with the defer property which means that all further event handling is temporarily suppressed as soon as the handling of this
3. 11 10 safe 1 queen 2 11 1 10 safe 1 safe 1 7 4 3 queen 2 trace_body 2 1 a 1 Each row of the table shows the information for a particular predicate by default split according to different caller predicates The table is sorted according to entry port count call redo resume The port counts give information about 150 e what are the most frequently called predicates call ports e whether predicates failed unexpectedly fail ports e whether predicates exited nondeterministically exit ports i e whether they left behind any choice points for backtracking e whether nondeterministically exited predicates were ever re entered to find alternative solutions redo ports e whether predicates did internal backtracking next ports in order to find the right clause This may indicate suboptimal indexing e how often predicates were delayed and resumed For more details about different options and output formats see the Reference Manual 15 8 Line coverage The line coverage library provides a means to ascertain exactly how many times individual clauses are called during the evaluation of a query The library works by placing coverage counters at strategic points throughout the code being analysed These counters are incremented each time the evaluation of a query passes them There are three locations in which coverage counters can be inserted 1 At the beginning of a code block 2 Between predicate calls wit
4. A 2 4 Escape Sequences within Strings and Atoms Within atoms and strings the escape sequences ES ANY are interpreted if the sequence matches one of the following valid escape sequences the corresponding special character is inserted into the quoted item Escape Sequence Result ESa ASCII alert 7 ES b ASCII backspace 8 ES f ASCII form feed 12 ES n ASCII newline 10 ES r ASCII carriage return 13 ES t ASCII tabulation 9 ES v ASCII vertical tab 11 ES e ASCII escape 27 ES d ASCII delete 127 ES ES the ES character itself ES AQ the AQ character itself ES SQ the SQ character itself ES LQ the LQ character itself ES NL ignored ES c BS NL ignored ES three octal digits character whose character code is the given octal value ES x hex digits ES character whose character code is the given hexadecimal value Any other character following the ES constitutes a syntax error If the syntax option iso_escapes is active the octal escape sequence can be of any length and must be terminated with an ES character A 3 Formal definition of clause syntax What follows is the specification of the syntax The terminal symbols are written in UPPER CASE or as the character sequence they consist of program im clause EOCL clause EOCL program clause n head head rulech goals rulech goals 224 head goals term_h term_g term 0 term N prefix_expression N infix_expression N postfix_expression
5. In the above example the profiler takes over three hundred samples resulting in a more accurate view of where the time is being spent in the program In this instance we can see that more than half of the time is spent in the nodiag 3 predicate making it an ideal candidate for optimisation This is left as an exercise for the reader 15 7 Port Profiler The port profiler is a performance analysis tool based on the idea of counting of events during program execution The events that are counted are defined in terms of the box model of exe cution the same model that the debugger uses see chapter 14 1 In this box model predicates are entered though call redo or resume ports and exited through exit exit fail or leave ports In addition other interesting events are indicated by ports as well nezt else delay The usage is as follows 1 Compile your program in debug mode as you would normally do during program devel opment 2 Load the port_profiler library 3 Run the query which you want to examine using port_profile 2 port_profile queen 1 2 3 4 0ut This will print the results in a table like the following PREDICATE CALLER call exit fail exit redo 5 3 nodiag 3 46 46 2 nodiag 3 46 45 1 qperm 2 qperm 2 30 28 16 14 qdelete 4 qperm 2 20 18 12 10 nodiag 3 nodiag 3 17 14 3 nodiag 3 safe 1 17 7 10 3 nodiag 3 17 17 i qdelete 4 qdelete 4 10 9 E 3 2 qperm 2 queen 2 1
6. lower_case export syntax_option no_array_subscripts export macro pretty 1 tr_pretty 2 All these declarations are valid locally in the module where they appear and in every module that imports them Initialization goals are exported as follows export initialization writeln I have been imported Unlike the other declarations above an exported initialization 1 directive is not executed locally in they module where it appears but only in the context of the module where it gets imported 7 2 3 Importing In order to use a definition that has been exported elsewhere it has to be imported Often it is desirable to import another module s interface as a whole i e everything it exports This is achieved by an import 1 directive of the form import amodule If the module is in a file and has to be compiled first then use_module 1 can be used which is a combination of ensure_loaded 1 see chapter 6 and import 1 use_module home util amodule If the module is a library in one of ECL PS s library directories then it can be loaded and imported by use_module library hash or simply using lib 1 as in lib hash It is also possible to import only a part of another module s interface using an import from directive import p 2 from amodule Note that this is the only form of import that can refer to a module that has not yet been loaded and therefore allows a restricted
7. 2 specifies the caller module to know the context Call inside module m Module where definition Caller module argument of twice 1 is looked up added to twice 1 twice X m m Im twice X lm m twice X cm m cm lm twice X Q cm lm cm call twice X cm cm cm 7 3 7 The Module Interface The primitive current_module 1 can be used to check for the existence of a module or to enumerate all currently defined modules Further details about existing modules can be retrieved using get_module_info 3 in particular information about the module s interface what other modules it uses and whether it is locked see 7 4 4 7 3 8 Module related Predicate Properties Information about a predicate s properties can be retrieved using the get_flag 3 primitive or printed using pred 1 The module related predicate properties are defined on off indicates whether code for the predicate has already been compiled If not only a declaration was encountered definition_module an atom the module where the predicate is defined visibility local exported reexported imported indicates the visibility of the predicate in the caller module tool on off indicates whether the predicate has been declared a tool For tool predicates tool _body 3 can be used to retrieve the predicate it maps to when the module argument is added To get information about a predicate visib
8. 27 28 29 30 31 32 33 34 35 Input arguments should be placed before output arguments Predicates which are not exported should be documented with a single line comment It is possible to use comment directives instead The sequence of predicates in a file is top down with a possibly empty utility section at the end All structures are defined in one file e g flow_structures ecl and are documented with comment directives Terms should not be used instead use named structures When possible use do loops instead of recursion When possible use separate predicates instead of disjunction or if then else There should be no nested if then else construct in the code All input data should be converted into structures at the beginning of the program there should be no direct access to the data afterwards All integer constants should be parametrized via facts There should be no integer values others than 0 and 1 in rules The final code should not use failure loops they are acceptable for debugging or testing purposes Cuts should be inserted only to eliminate clearly defined choice points The final code may not contain open choice points except for alternative solutions that still can be explored This is verified with the tracer tool in the debugger Customizable data facts should always be at the end of a file their use is deprecated The predicate member 2 should only be used where b
9. When structures are printed they are not translated back into the curly brace syntax by default The reason this is not done is that this can be bulky if all fields are printed and often it is desirable to hide some of the fields anyway A good way to control printing of big structures is to write special purpose portray transformations for them for instance local portray property functor of book tr_book_out 2 tr_book_out book author A title T no_macro_expansion book author A title T which will cause book 4 structures to be printed like book author twain title tom sawyer while the other two arguments remain hidden 5 1 4 Inheritance Structures can be declared to contain other structures in which case they inherit the base structure s field names Consider the following declarations local struct person name address age local struct employee p person salary The employee structure contains a field p which is a person structure Field names of the person structure can now be used as if they were field names of the employee structure 28 eclipse 1 Emp employee name john salary 2000 Emp employee person john _105 _106 2000 yes Note that as long as the curly brace and of syntax is used the employee structure can be viewed either as nested or as flat depending on what is more convenient in a given situation In particular the embedded structure can still be accessed as a who
10. dif T1 T2 equal_args T1 T2 Vars gt nonvar Vars gt Vars inst V gt suspend dif T1 T2 3 V gt inst suspend dif T1 T2 3 Vars gt bound fail nothing to suspend on they are identical true the terms are different equal_args A1 A2 Vars 187 A1 A2 gt true var A1 gt var A2 gt Vars bound A1 A2 Vars inst A1 var A2 gt Vars inst A2 equal_terms A1 A2 Vars Ja equal_terms R1 R2 Vars Ri FlArgs1 R2 FlArgs2 equal_lists Args1 Args2 Vars equal_lists _ equal_lists X1 A1 X2 A2 Vars equal_args X1 X2 Vars nonvar Vars gt true we have already found a variable equal_lists A1 A2 Vars Note that equal_args 3 can yield three possible outcomes success failure and delay Therefore if it succeeds we have to make the distinction between a genuine success and delay which is done using its third argument The predicate dif 2 behaves exactly as the built in predicate 2 eclipse 26 dif X Y X X Y Y Delayed goals dif X Y yes eclipse 27 dif X Y X Y no more solution eclipse 28 dif X Y X f A B Y f a C B C Aza 188 no more solution eclipse 291 dif X Y X a Y b X a Y b yes Note also that the scan stops at the first variable being compared to a different term In this way we scan only the part of the terms which is absolutely necess
11. foreach X List do true Transpose a 2D array A 1 5 1 2 3 3 2 dim A R C dim T C R foreachelem X A I J param T do X is T J I Same using foreachindex A I 0 5 1 2 3 3 2 dim A R C dim T C R foreachindex I J A param A T do subscript A I J X subscript T J I X The following two are equivalent foreach X 1 2 3 do writeln X fromto 1 2 3 In 0ut do In X Out writeln X The following two are equivalent 33 count 1 1 5 do writeln I fromto 0 10 1 5 do I is I0 1 writeln I Some examples for nested loops Print all pairs of list elements Xs 1 2 3 4 foreach X Xs param Xs do foreach Y Xs param X do writeln X Y and the same without symmetries Xs 1 2 3 4 fromto Xs X Xs1 Xsi do foreach Y Xs1 param X do writeln X Y Find all pairs of list elements and collect them in a result list pairs Xs Ys Zs foreach X Xs fromto Zs Zs4 Zs1 O param Ys do foreach Y Ys fromto Zs4 Zs3 Zs2 Zs1 param X do Zs3 X Y Zs2 Flatten a 2 dimensional matrix into a list flatten_matrix Mat Xs dim Mat M N for I 1 M fromto Xs Xs4 Xsi O param Mat N do for J 1 N fromto Xs4 X Xs2 Xs2 Xs1 34 param Mat I do subscript Mat I J X Same using multifor to avoid nesting flatten_matrix Mat Xs dim Mat
12. h size This option is largely obsolete and currently effective only on SunOS 4 It specifies to which limit the memory consumption of the ECL PS private heap can grow The size is specified in kilobytes followed by an optional K in megabytes followed by M or in gigabytes followed by G The default is 32M ie 32 Megabytes 245 s size This option is largely obsolete and currently effective only on SunOS 4 It specifies to which limit the memory consumption of the ECL PS shared heap can grow The size is specified in kilobytes followed by an optional K in megabytes followed by M or in gigabytes followed by G The default is 64M ie 64 Megabytes D directory This options allows to explicitly specify the ECL PS installation directory i e the directory under which the system tries to find the ECL PS runtime system and libraries This option overrides and renders unnecessary any setting of the ECLIPSEDIR environment variable Unix or respectively an ECLIPSEDIR registry entry Windows that may be in effect The ECL PS system will ignore this argument and everything that follows on the comm mand line The Prolog program will only see the part of the command line that follows this argument 246 Appendix E Style Guide Every ECL PS programming project should adopt a number of style rules This appendix gives only a sample set of rules which can serve as a guideline Project teams should adapt them to
13. or a semi colon A return will end the query successfully A semi colon will initiate backtracking in an attempt to find another solution to the query Note that it is not necessary to type a new line after the semicolon one keystroke is enough When the top level loop can detect that there are no 13 further solutions it does not wait for the semicolon or newline but it displays directly the next prompt For example in a query on a family database eclipse 2 father X Y X abraham Y isaac More typed X isaac jacob lt Il yes eclipse 3 Queries may be extended over more than one line When this is done the prompt changes to a tabulation character i e the input is indented to indicate that the query is not yet completed The fullstop marks the end of the input 3 5 6 Interrupting the execution If a program is executing it may be interrupted by typing CTRL C interrupt in the UNIX environment This will invoke the corresponding interrupt handler see section 13 3 By default the system prints a menu offering some alternatives C interruption type a b c e or h for help help a abort b break level c continue e exit h help interruption type a b c e or h for help The a option returns to the toplevel b starts a nested toplevel c continues the interrupted execution d switches the debugger to creep mode provided it is running and e is an emergency ex
14. 5_w X lt gt write_term X depth 5 variables anonymous 10 4 2 Other Term Output Predicates The other term output predicates write 2 writeq 2 write_canonical 2 display 2 print 2 can all be defined in terms of write_term 3 or similarly in terms of printf 3 as follows write X write_term X writeq X write_term X variables raw attributes full transform false quoted true depth full write_canonical X write_term X variables raw attributes full transform false quoted true depth full dotlist true operators false display X write_term X dotlist true operators false print X write_term X portrayed true 10 4 3 Default Output Options It is possible to set default output options for an output stream in order to globally affect all output to this particular stream The set_stream_property 3 predicate can be used to assign default options in the same form as accepted by write_term 3 to a stream These options will then be observed by all output predicates which do not override the particular option 93 94 Chapter 11 Dynamic Code An ECL PS predicate can be made dynamic That is it can have clauses added and removed from its definition at run time This chapter discusses how to do this and what the implications are 11 1 Compiling Procedures as Dynamic or Static If it is intended that a procedure be altered through the use of assert 1 and r
15. 73 74 Chapter 9 Non logical Storage and References 9 1 Introduction This chapter describes primitives that allow to break the normal logic programming rules in two ways e information can be saved across logical failures and backtracking e information can be accessed by naming rather than by argument passing Obviously these facilities must be used with care and should always be encapsulated in an interface that provides logical semantics ECLiPSe provides several facilities to store information across backtracking The following table gives an overview If at all possible the handle based facilities bags shelves and stores should be preferred because they lead to cleaner reentrant code without global state and reduce the risk of memory leaks Facility Type Access See shelves array by handle shelf create 2 3 bags unordered bag by handle bag_create 1 stores hash table by handle store_create 1 named shelves array by name shelf 2 named stores hash table by name store l non logical variables single cell by name variable 1l non logical arrays array by name array 1 2 records ordered list by name record 1 2 dynamic predicates ordered list by name dynamic 1 assert 1 The other facility described here Global References does not store information across failure but provides a means to give a name to an otherwise logical data structure See section 9 7 9 2 Bags A bag is an anonymous object which can be
16. Every stream is identified by a small integer but it can have several symbolic names aliases which are atoms Most of the built in predicates that require a stream to be specified have a stream argument at the first position e g write Stream Term This argument can be either the stream number or a symbolic stream name An alias name can be given to a stream either when it is created or explicitly by invoking set_stream 2 set_stream Alias Stream To find the corresponding stream number use get_stream 2 get_stream StreamOrAlias StreamNr get_stream 2 can also be used to check whether two stream names are aliases of each other 10 1 3 Opening New Streams Streams provide a uniform interface to a variety of I O devices and pseudo devices The following table gives an overview of how streams on the different devices are opened I O device How to open tty implicit stdin stdout stderr or open 3 of a device file file open FileName Mode Stream string open string String Mode Stream queue open queue String Mode Stream pipe exec 2 exec 3 and exec_group 3 socket socket 3 and accept 3 null implicit null stream How to open streams onto the different I O devices Most streams are opened for input or output by means of the open 3 or open 4 predicate The goals 1Note that the stream numbers are not the same as UNIX file descriptors 84 open SourceSink Mode Stream
17. Invoke ruptime 1 and parse its output to a list of accessible machines in the form info Host UpTime Users Load1 Load2 Load3 machine_list List exec 2 cannot be used as it could overflow the pipe and then block exec ruptime 1 null S P parse_ruptime S List close S wait P _ Parse the output of ruptime parse_ruptime S InfolList parse_uptime_record S Info l parse_ruptime S List parse_ruptime _ parse one line of the ruptime output parse_uptime_record S info Host Time Users Load1 Load2 Load3 read_token S Host _ Host end_of_file read_token S Up _ Up up gt read_time S Time read_token S _ 212 read_token S Users _ read_token S _ _ read_token S _ read_token S load _ read_token S Loadi _ read_token S _ read_token S Load2 _ read_token S _ read_token S Load3 _ read_time S _ Time 0 Parse the up down time and if the machine is down return 0 read_time S Time read_token S T1 _ read_token S _ gt Days T1 read_token S Hours _ read_token S _ Days O Hours Ti read_token S Mins _ Time is 24 Days Hours 60 Mins and here is a script of the session eclipse 1 up up pl compiled traceable 4772 bytes in 0 08 seconds yes eclipse 2 connect_machines sending to mimas
18. ndownarrow key Move current subterm down by N levels nB Move current subterm down by N levels The down arrow key moves the current subterm down from its current position This command is only valid if the current subterm is a compound term and so has subterms itself A structure has in general more than one argument so there is a choice of which argument position to move down to This argument is not directly specified by the user as part of the command but is implicitly specified the argument position selected is the argument position of the current subterm within its parent foo a g b 1 2 3 INSPECT foo 3 gt 2 lt NL gt g b 1 2 INSPECT list 1 head 2 tail 7 gt 3down subterm 2 for 3 levels Ml INSPECT atom gt In the above example the user moves down into the second argument and then use the down arrow key to move down into the second argument for 2 levels the numeric argument typed before the arrow key specified the number of levels that the current subterm was moved down by The command moves into the second argument because it was at the second argument position when the command was issue However there is not always an argument position for the current sub term For example when the current sub term is at the toplevel of the goal or if it is at an attribute In these cases the default for the argument position to move down into is the first argument INSPECT atom gt O lt NL gt foo a g b
19. 2 50 67 gt 2 50 67 2 39 2 50 2 50 168 169 1 166 2 166 173 3 105 set a spy point debugger cmd 138 3 72 X 3 2 50 D command line option 246 b command line option 245 e command line option 245 g command line option 245 h command line option 245 1 command line option 245 s command line option 246 Print structure definition debugger cmd 134 print definition debugger cmd 128 eclipse_history 15 eclipserc 17 2 59 63 113 2 51 2 50 118 199 lt 2 50 67 2 51 2 50 51 69 2 51 67 2 50 51 69 2 67 help debugger cmd 128 X 3 5 1 183 0 Move current subterm to toplevel de bugger cmd 131 a abort debugger cmd 127 A Move current subterm up by N levels debugger cmd 130 abolish 198 abort 0 115 accept 3 84 86 accessible 58 add_attribute 3 156 add_attribute 2 156 after events 109 als 1 53 ambiguity 228 ambiguity warning 58 append 3 51 arg 3 35 37 51 81 argc 1 203 argv 2 203 arithmetic 67 built ins 67 coroutining 73 expressions 71 functions 69 predefined arithmetic functions 69 prefer_rationals 71 types 68 user defined arithmetic 71 arity 3 array 4 35 array 1 79 arrays 198 non logical 78 assert 1 45 46 95 97 100 198 218 219 251 assert 1 2 44 at 2 89 90
20. 241 C 1 11 Extensions 242 C 2 Stack Overflows a 204040 a a ae Se ee a 242 C3 CIs A eset Yes Es ahs os a a bol es es LAL ae Ps 243 CA User Defined Events 2 15 uenta ess E Bee Gee he dee a AA AL eo 243 ECL PS Command Line Options 245 E Style Guide 247 Ely Stylerrulesie 2 5 acs aod ee ie te bane B bok oa oe ete a e 247 E 2 Module sttuctire es ass ph BAe Ae Be a Sp tee te eS ae AL HO abet 249 E 3 Predicate definition 2 2 ee ee 249 Restrictions and Limits 251 viii Chapter 1 Introduction 1 1 What is ECL PS ECL PS ECL PS Common Logic Programming System is a Prolog based system whose aim is to serve as a platform for integrating various Logic Programming extensions in particular Constraint Logic Programming CLP The kernel of ECL PS is an efficient implementation of standard Edinburgh like Prolog as described in basic Prolog texts 2 It is built around an incremental compiler which compiles the ECL PS source into WAM like code 13 and an emulator of this abstract code 1 2 Overview The ECL PS logic programming system was originally an integration of ECRC s SEPIA Mega Log and parts of the CHIP systems It was then further developed into a Constraint Logic Programming system with a focus on hybrid problem solving and solver integration The docu mentation is organised as follows The User Manual describes the functionality of the ECL PS kernel this document The Constraint
21. 248 ifdef library 45 import 1 57 101 importing 57 include 1 45 52 61 incval 1 78 79 indexing 38 infix 227 infix postfix ambiguity 228 inheritance 28 init_suspension_list 2 178 initialisation file 17 initialization 64 initialization 1 57 inline 2 47 100 inlining 47 input 83 input output 83 insert_suspension 3 178 insert_suspension 4 178 insert_suspension 4 3 178 Inspect subterm commands debugger 128 interaction with output modes 136 instance 2 158 256 instantiated 4 integer constants 248 integer 1 50 integers 68 interrupt 14 interrupts 114 tkeclipse 116 interval arithmetic 69 is 2 48 67 72 182 is dynamic 1 95 is_suspension 1 177 is dynamic 1 95 iteration 29 j jump to level debugger cmd 125 kill 2 115 207 208 kill_suspension 1 177 kill_display_matrix 1 21 1 leap debugger cmd 125 language 63 leftarrow key Move current subterm left by N positions debugger cmd 131 lib suspend 167 lib timeout 111 lib 1 16 45 57 lib 1 2 52 libraries 16 56 library coverage 151 suspend pl 157 library search path 16 library hash 77 library source_processor 88 library_path 16 line coverage 151 lint library 143 lint 1 145 lint 2 145 list 4 list_error 3 112 listing 0 1 218 load 1 198 204 local stack 199 local 1 27 57 58 78 79 99 218 lock 1 65 lock 2 65 locking 64 log_output
22. 48 ol 52 53 Fiz Importing x 43 8 4 a e e Ae SOE A hae e Gs 57 7 2 4 Definitions Visibility and Accessibility 58 7 3 Advanced Topics Latas Ae he ee ee Be a eS 58 7 3 1 Solving Name Conflicts 0 0 0 000000 eee ee ee 58 7 3 2 Qualified Access via 2 pa Na Go eg LN Me abe 59 7 3 3 Reexport Making Modules from Modules 60 7 3 4 Modules and Source Files ooa aaa ee 60 7 3 5 Tools and Caller Modules e o 61 7 3 6 Lookup Module vs Caller Module 63 7 3 7 The Module Interface e e 63 7 3 8 Module related Predicate Properties o 63 7 4 Less Common Topies ese lr a eee ee Bees AOE ai oe Een ds OG 63 7 4 1 Modules Using Other Languages e e 63 7 4 2 Creating and Erasing Modules at Runtime 64 7 4 3 Initialization and Finalization 02 208 64 GAA Locking Modules ga out adin Be da Ee Soe 64 Arithmetic Evaluation 67 8 1 Built Ins to Evaluate Arithmetic Expressions 004 67 8 1 1 Arithmetic Evaluation vs Arithmetic Constraint Solving 67 8 2 Numeric Types and Type Conversions 0 e 68 Stel A a Be BD A a 68 8 2 2 Rationals 2 4 sa sd aa dee ea eae be a ae ade 68 8 2 3 Floating Point Numbers 0 0 00 000 eee ee 68 8 2 4 Bounded Real Numbers 0 0 00000 eee ee ee 68 8 2 5 Type Conversions neme
23. 9 1 9 gt jump to invoc 2 Note that these monitors can also be set up from within the program code using one of the built ins spy var 1 or spy term 2 Z par zap This command allows to skip over or to a specified port When this command is executed the debugger prompts for a port name e g fail or a negated port name e g exit Execution then continues until the specified port appears or in the negated case until a port other than the specified one appears The default is the negation of the current port which is useful when exiting from a deep recursion a long sequence of EXIT or FAIL ports 14 6 3 Commands to Modify Execution f par fail Force a failure of the procedure with the specified invocation number The default is to force failure of the current procedure 126 y 2 a abort Abort the execution of the current query and return to the top level The command prompts for confirmation 14 6 4 Display Commands This group of commands cause some useful information to be displayed d par delayed goals Display the currently delayed goals The optional argument allows to restrict the display to goal of a certain priority only The goals are displayed in a format similar to the trace lines except that there is no depth level and no port name Instead the goal priority is displayed in angular brackets eclipse 5 X Y 1 9 X gt Y Y gt X 1 1 CALL X Y 1 9 gt cre
24. ECL PS provides an incremental garbage collector for the global and the trail stack It is also equipped with a dictionary garbage collector that frees memory that is occupied by obsolete atoms and functors Both collectors are switched on by default and are automatically invoked from time to time Nevertheless there are some predicates to control their action The following predicates affect both collectors set_flag gc on Enable the garbage collector the default set_flag gc verbose The same as on but print a message on every collection the message goes to toplevel_output GC global 96208 88504 92 0 trail 500 476 95 2 time 0 017 It displays the area to be searched for garbage the amount and percentage of garbage and the time for the collection The message of the dictionary collector is as follows DICTIONARY GC 2814 653 23 2 time 0 033 It displays the number of dictionary entries before the collection the number of collected entries the percentage of reduction and the collection time set_flag gc off Disable the garbage collector and risk an overflow eg for time critical execution sequences Predicates related to the stack collector are set_flag gc_policy adaptive This option affects the triggering heuristics of the garbage col lector together with the gc_interval setting The adaptive policy the default minimises garbage collection time set_flag gc_policy fi
25. M N multifor I J 1 M N foreach X Xs param Mat do subscript Mat I J X Same for an array of arbitrary dimension flatten_array Array Xs dim Array Dims multifor Idx 1 Dims foreach X Xs param Array do subscript Array Idx X Same but returns the elements in the reverse order flatten_array Array Xs dim Array Dims multifor Idx Dims 1 1 foreach X Xs param Array do subscript Array Idx X 5 3 Array Notation Since our language has no type declarations there is really no difference between a structure and an array In fact a structure can always be used as an array creating it with functor 3 and accessing elements with arg 3 However this can look clumsy especially in arithmetic expressions ECL PS therefore provides array syntax which enables the programmer to write code like 35 eclipse 1 Prime a 2 3 5 7 11 X is Prime 2 Prime 4 X 10 Prime a 2 3 5 7 11 yes Within expressions array elements can be written as variable indexlist or structure indexlist sequences e g X 3 M 3 4 s 4 5 6 3 Indices run from 1 up to the arity of the array structure The number of array dimensions is not limited To create multi dimensional arrays conveniently the built in dim 2 is provided it can also be used backwards to access the array dimensions eclipse dim M 3 4 dim M D M _131 _132 _133
26. _134 _126 _127 _128 129 121 _122 _123 _124 D 3 4 yes Although dim 2 creates all structures with the functor this has no significance other than reminding the programmer that these structures are intended to represent arrays Array notation is especially useful within loops Here is the code for a matrix multiplication routine matmult M1 M2 M3 dim M1 MaxIJ MaxK dim M2 MaxK MaxIJ dim M3 MaxIJ MaxIJ for I 1 MaxIJ param M1 M2 M3 MaxIJ MaxK do for J 1 MaxIJ param M1 M2 M3 1 MaxK do for K 1 MaxK fromto 0 Sum0 Sum1 Sum param M1 M2 1 J do Sumi is SumO M1 1 K M2 K J subscript M3 I J Sum Ds 36 5 3 1 Implementation Note Array syntax is implemented by parsing variable list and structure list sequences as terms with the functor subscript 2 For example X 3 gt subscript X 3 M 3 4 gt subscript M 3 4 s 4 5 6 3 gt subscript s 4 5 6 3 If such a term is then used within an arithmetic expression a result argument is added and the built in predicate subscript 3 is called which is a generalised form of arg 3 and extracts the indicated array element When printed subscript 2 terms are again printed in array notation unless the print option to suppress operator notation O is used 5 4 The String Data Type In the Prolog community there have been ongoing discussions about the need to have a special st
27. as the command 1 1 CALL foo a g b 1 2 3 gt 2 lt NL gt gb 1 21 INSPECT g 2 gt 2 lt NL gt 1 2 INSPECT list 1 head 2 tail gt 2 lt NL gt 2 INSPECT list 1 head 2 tail gt 2 lt NL gt INSPECT atom gt O lt NL gt foo a g b 1 2 3 INSPECT foo 3 gt Moving to the top can also be done by the command and not giving any argument or 0 when prompted for the argument nleftarrow key Move current subterm left by N positions 131 nD Move current subterm left by N positions The leftarrow key or the equivalent D moves the current subterm to a sibling subterm i e fellow argument of the parent structure that is to the left of it Consider the structure foo a g b 1 2 3 then for the second argument g b 1 2 a is its only left sibling and 3 its only right sibling For the third argument 3 both a distance of 2 and g b 1 2 distance of 1 are its left siblings The optional numeric argument for the command specifies the distance to the left that the current subterm should be moved It defaults to 1 foo a g b 1 2 3 INSPECT fo00 3 gt 3 lt NL gt 3 INSPECT integer gt 2left subterm INSPECT atom gt If the leftward movement specified would move the argument position before the first argument of the parent term then the movement will stop at the first argument foo a g b 1 21 3 INSPECT fo00 3 gt 3 lt NL gt 3 INSPE
28. delete 1 205 demon 179 demon 1 179 dictionary 198 DID 4 dif 2 188 189 191 difference list 4 dim 2 36 disjunction 248 display 2 93 do 2 29 52 document library 143 double float 68 downarrow key Move current subterm down by N levels debugger cmd 133 dynamic 1 44 95 96 eci_to_html 3 146 ECL PS 1 eclipse_language 63 ECLIPSEINIT 17 ECLIPSELIBRARYPATH 16 ensure_loaded 1 45 57 245 ensure_loaded 1 45 enter_suspension_list 3 178 env 0 203 204 207 erase_all 1 198 erase_array 1 79 198 erase_module 1 64 erase_array 1 79 error 83 error handlers 233 error 2 112 error 3 112 error_id 2 112 error_id 2 112 errors 111 handlers 113 user defined 114 event handlers 233 event 1 108 116 event_after 2 109 event_after_every 2 109 event_create 3 108 events 107 175 events_after 1 109 events_nodefer 0 111 exec 2 84 86 206 207 exec 3 84 86 206 207 exec_group 3 84 86 207 exec_group 3 206 existing _file 4 205 existing _file 4 205 exists 1 205 exit status 245 exit 1 12 203 exit_block 1 111 113 119 120 242 Exiting ECL PS 12 export 1 5 27 29 56 57 99 exporting 56 extended head 182 f fail debugger cmd 126 fact 4 factorial function 71 fail O 113 failure loop 248 fatal errors 243 fcompile 1 45 51 fcompile 2 52 fcompile fcompile 1 52 file name 247 finalization 64 findall 3 51 175 fix 2 69 255 float 1
29. either the last tried clause has called a procedure that has left a choice point it has exited through an EXIT port In that case the nested procedure box is re entered though another REDO port 118 Otherwise if the last clause tried does not contain any nondeterministically exited boxes but there are other untried clauses in the procedure box the next possibly matching clause will be tried The last REDO port in such a sequence is the one which contains the actual alternative that is tried The variable instantiations for all REDO ports in such a sequence are the ones corresponding to the call time of the last one LEAVE This port allows to trace the execution of a the block 3 and exit_block 1 predicates within the box model The predicate block 3 is traced as a normal procedure If the goal in its first argument fails block 3 fails if it exits block 3 exits If the predicate exit_block 1 is called and exited since it never fails all the goals inside the matching block are left through a special port called LEAVE so that each entry port matches with an exit port The recover procedure in the third argument of block 3 is then called and traced normally and block 3 will exit or fail or even leave depending on the recover procedure As with the FAIL port no argument value are displayed in the LEAVE port DELAY The displayed goal becomes suspended This is a singleton port it does not enter or leave a box However a new inv
30. even when the displayed pro cedure is not the current one e g during term inspection An alias for the c command is to just type newline Return key ns skip If given at an entry port of a box CALL RESUME REDO this command skips the execution until an exit port of this box EXIT FAIL LEAVE If given in an exit port it works like creep Note that sometimes the i command is more appropriate since it skips to the next port of the current box no matter which A counter if specified repeats this command nl leap Continues to the next spy point any port of a procedure which has its spy flag set A counter if specified repeats this command i par invocation skip Continue to the next port of the box with the invocation number specified The default invocation number is the one of the current box Common uses for this command are to skip from CALL to NEXT from NEXT to NEXT EXIT FAIL from EXIT to REDO or from DELAY to RESUME j par jump to level Continue to the next port with the specified nesting level which can be higher or lower than the current one The default is the parent s level i e to continue until the current box is exited ignoring all the remaining subgoals of the current clause This is particularly useful when a c creep has been typed where a s skip was wanted n nodebug This command switches tracing off for the remainder of the execution However the next top level query will be traced again Use
31. mod 200 xfy 7 231 200 fx NJ 232 Appendix C Events We list here the ECL PS event types together with the default event handlers and their descrip tion Unless otherwise specified the arguments that the system passes to the event handler are First Argument Second Argument Third Argument Event number Culprit goal Caller Module If the caller module is unknown a free variable is passed C 1 Event Types C 1 1 Argument Types and Values Event Event Type Default Event Handler 1 general error error_handler 2 2 term of an unknown type error_handler 2 4 instantiation fault error_handler 2 5 type error error_handler 2 6 out of range error_handler 2 it string contains unexpected characters error_handler 2 8 bad argument list error_handler 2 233 C 1 2 Arithmetic Environment Event Event Type Default Event Handler 15 creating parallel choice point fail 0 16 failing to parallel choice point fail 0 17 recomputation failed error_handler 2 20 arithmetic exception error_handler 2 21 undefined arithmetic expression error_handler 3 23 comparison trap compare_handler 4 24 number expected error_handler 2 25 integer overflow integer_overflow_handler 2 30 trying to write a read only flag error_handler 2 31 arity limit exceeded error_handler 2 32 no handler for event warning_handler 2 33 event queue overflow error_handler 2 C 1 3 Data and Me
32. once something is read from a queue it is no longer accessible A queue is considered to be at its end of file position when it is currently empty however this is no longer the case when the queue is written again A useful feature of queues is that they can raise a synchronous event when data arrives on the empty queue To create such an event raising queue this has to be specified as an option when opening the queue with open 4 In the example we have chosen the same name for the stream and for the event which is not necessary but convenient when the same handler is going to be used for different queues eclipse 1 user handle_queue_event Q read_string Q _ Data printf Queue s received data s n Q Data yes eclipse 2 set_event_handler eventq handle_queue_event 1 yes eclipse 3 open queue update eventq event eventq yes eclipse 4 write eventq hello Queue eventq received data hello yes 10 4 Term Output Formats 10 4 1 Write_term and Printf The way ECL PS terms are printed can be customised in a number of ways The most flexible predicates to print terms are write_term 3 and printf 3 They both allow all variants of term output but the format is specified in a different way The following figure gives an overview 91 Output Option for Format Meaning write_term 2 3 char for print
33. open SourceSink Mode Stream Options open a communication channel with SourceSink If SourceSink is an atom or a string a file is being opened and SourceSink takes the form of a file name in the host machine environment ECL PS uses an operating system independent path name syntax where the components are separated by forward slashes The following forms are possible e absolute path name e g usr peter prolog file pl e relative to the current directory e g prolog file pl e relative to the own home directory e g prolog file pl e start with an environment variable e g HOME prolog file pl e relative to a user s home directory e g peter prolog file pl UNIX only e specifying a drive name e g C prolog file pl Windows only Note that path names usually have to be quoted in single or double quotes because they contain non alphanumeric characters If SourceSink is of the form string InitString a pseudo file in memory is opened see section 10 3 1 If SourceSink is of the form queue InitString a pseudo pipe in memory is opened see section 10 3 2 Mode must be one of the atoms read write append or update which means that the stream is to be opened for input output output at the end of the existing stream or both input and output respectively Opening a file in write mode will create it if it does not exist and erase the previous contents if it does exist Opening a file in append mode will keep the current
34. will unify Clause with a clause on the dynamic database and remove it If Clause does not specify a dynamic procedure an exception is raised ECL PS s dynamic database features the so called logical update semantics This means that any change in the database that occurs as a result of executing one of the builtins of the abolish assert or retract family affects only those goals that start executing afterwards For every call to a dynamic procedure the procedure is virtually frozen at call time Mt should be remembered that because of the definition of the syntax of a term to assert a procedure of the form p q r it is necessary to enclose it in parentheses assert p q r 97 98 Chapter 12 ECL PS Macros 12 1 Introduction ECL PS provides a general mechanism to perform macro expansion of Prolog terms Macro expansion can be performed in 3 situations read macros they are expanded just after a Prolog term has been read by the ECL PS parser Note that the parser is not only used during comilation but by all term reading predi cates compiler macros they are expanded only during compilation and only when a term occurs in a certain context clause or goal write macros they are expanded just before a Prolog term is printed by one of the output predicates Macros are attached to classes of terms specified by their functors or by their type Macros obey the module system s visibility rules They may be either local o
35. 1 2 3 4 5 for 1 1 5 foreach I List do true or count 1 1 5 foreach I List do true Make a list of length 3 foreach _ List for _ 1 3 do true or foreach _ List count _ 1 3 do true Get the length of a list foreach _ a b c count _ 1 N do true Actually the length 2 builtin is almost length List N foreach _ List count _ 1 N do true Iterate I J over 1 1 1 2 1 3 2 1 3 3 multifor I J 1 3 do writeln 1 J 32 Similar but have different start stop values for I and J multifor I J 2 1 4 5 do writeln I J Similar but only do odd values for the second variable multifor List 2 1 4 5 1 2 do writeln List Filter list elements foreach X 5 3 8 1 4 6 fromto List Out In do X gt 3 gt Out X In Out In Iterate over structure arguments foreacharg X s a b c d e do writeln X Collect args in list bad example use if you really want to do that foreacharg X s a b c d e foreach X List do true Collect args reverse foreacharg X s a b c d e fromto In X In List do true or like this S s a b c d e functor S _ N for 1 N 1 1 foreach A List param S do arg I S A Rotate args in a struct SO s a b c d e functor S0O F N functor Si F N foreacharg X S0 I param S1 N do I1 is I mod N 1 arg 11 S1 X Flatten an array into a list foreachelem X 0 5 1 2 O 3 3 2
36. 2 trans_a 2 user compiled traceable 204 bytes in 0 00 seconds yes eclipse 2 read X a 1 hello X b hello transformed yes eclipse 3 read X a 1 bye X a 1 bye not transformed yes If the transformation function fails the term is not transformed Thus a 1 zzz is transformed into b zzz but a 1 zzz is not transformed The arguments are transformed bottom up It is possible to protect the subterms of a transformed term by specifying the flag protect_arg A term can be protected against transformation by quoting it with the protecting functor by default it is no_macro_expansion 1 eclipse 4 read X a 1 no_macro_expansion a 1 zzz X b a 1 zzz Note that the protecting functor is itself defined as a macro trprotect no_macro_expansion X X export macro no_macro_expansion 1 trprotect 2 protect_arg A local macro is only visible in the module where it has been defined When it is defined as exported then it is copied to all other modules that contain a use_module 1 or import 1 for this module The transformation function should also be exported in this case There are a few global macros predefined by the system e g for gt 2 grammar rules see below or with 2 and of 2 structure syntax see section 5 1 These predefined macros can be hidden by local macro definitions The global flag macro_expansion can be used to disable macro expansion globally e g for de
37. Comments There are two types of comments bracketed comments which are enclosed by CM1 CM2 and CM2 CM1 and the end of line comment which is enclosed by CM and NL Both types of comment behave as separators When the syntax option nested_comments is on the default is off bracketed comments can be nested A 3 2 Operators In Prolog the user is able to modify the syntax dynamically by explicitly declaring new operators The builtin op 3 performs this task As in Edinburgh Prolog a lower precedence value means that the operator binds stronger 1 strongest 1200 weakest Any atom whether symbolic alphanumeric or quoted can be declared as an operator Once an operator has been declared the parser will accept the corresponding operator notation and certain output builtins will produce the operator notation if possible There are three classes of operators prefix infix and postfix e When f is declared prefix unary fx or fy then the term f X can alternatively be written asf X e When f is declared prefix binary fxx or fxy then the term f X Y can alternatively be written as f X Y e When f is declared postfix xf or yf then the term f X can alternatively be written as X f e When f is declared infix xfx xfy or yfx then the term f X Y can alternatively be written as X f Y An operator can belong to more than one class e g the plus sign is both a prefix and an infix operator at the same time In the associativ
38. Constraint Library Manual for instance 2 2 gt 2 lt 2 gt 2 lt 2 2 2 gt 2 lt 2 gt 2 lt 2 2 2 gt 2 lt 2 gt 2 lt 2 integers 1 reals 1 The solver will suspend these predicates until all their arguments are ground The suspend library is loaded into ECL PS on start up but the constraints associated with the suspend solver are not imported To use them either import the suspend library to the current module or call the constraint qualified with the module suspend X gt 2 suspend X lt 5 17 4 Development System Support As seen in the above example the top level loop indicates floundering by printing a message about delayed goals The command line toplevel then prompts and offers to print a list of all delayed goals The Tkeclipse development environment provides better support in the form of the Delayed Goals Viewer which can be used to look at all delayed goals or a filtered subset of them The tracer supports advanced control features via the box model ports DELAY and RESUME It also shows goal priorities if they deviate from the default priority in angular brackets 17 5 Declarative Suspension Delay Clauses For delaying calls to user defined Prolog predicates ECL PS provides several alternatives the first being delay clauses Delay clauses are a declarative means they are in fact meta clauses to specify the conditions under which the p
39. Ins and Attributed Variables 16 9 Examples of Using Attributed Variables 16 9 1 Variables with Enumerated Domains 16 10Attribute Specification 17 Advanced Control Features LL tro ducto At gti A Sv ee ew a ee ee LED CONCOD S rn ls a a e we east ri 4 ta e 17 2 1 The Structured Resolvent e 172 2 Flotindering A A A ta 17 3 Suspending Built Ins and the Suspend Library 17 4 Development System Support 17 5 Declarative Suspension Delay Clauses o o e pee 17 6 Explicit supension with suspend 3 17 7 Waking conditions 17 7 1 Standard Waking Conditions on Variables 000 4 17 7 2 Library defined Waking Conditions on Variables 17 7 3 Global Symbolic Waking Conditions Triggers 17 8 Lower level Primitives e 17 8 1 Suspensions and Suspension Lists ee 17 8 2 Creating Suspended Goals e 17 8 3 Operations on Suspensions soosoo a a 17 8 4 Examining the Resolvent a 17 8 5 Attaching Suspensions to Variables oaoa a a 17 8 6 User defined Suspension Lists 2 2 ee 17 8 7 Attaching Suspensions to Global Triggers 17 8 8 Scheduling Suspensions for Waking 0 0000 eee 17 9 Demon Predicates aaa a 17 10More about Priorities
40. KO 0 0 38 safe NOTE It is imperative to understand that the results of mode analysis are merely suggestions for the invocation modes of a predicate based on runtime information If there are potential predicate invocation modes that were not exercised during runtime the tool is unable to account for them in its analysis For the mode specifier the mode analyser does not determine whether the variable occurs in any other argument i e is aliased this must be manually verified In summary the programmer must verify that the suggested modes are correct before using the directive in the code If the instantiation of the predicate call violates its mode declaration no exception is raised and its behaviour is undefined For more details about invocation mode analysis see the Reference Manual 154 Chapter 16 Attributed Variables 16 1 Introduction The attributed variable is a special ECL PS data type which represents a variable together with attached attributes In the literature attributed variables are sometimes referred to as metaterms The name metaterm originates from its application in meta programming for an object level program a metaterm looks like a variable but for a meta program the same variable is just a piece of data which possibly together with additional meta level information forms the metaterm The attributed variable is a powerful means to implement various extensions of the plain Prol
41. Module 135 Procedure Name Arity Module 136 Procedure Name Arity Module 137 Procedure Name Arity Module 138 Variable name atom undefined 139 File Size Time see below Module 140 Emulate undefined 141 Goal Module 142 Goal Module 143 Goal Module 144 Goal if an execution error or Culprit clause if Module compiler error 145 Name Arity OldFile NewFile Module 146 File Module 147 File 148 Clause Module 237 The second argument for the event 139 depends on the predicate where it was raised e compile 1 2 file name code size compile time e compile stream 1 string code size compile time with a string stream e compile stream 1 file name code size compile time with a stream associated to a file C 1 7 Top Level Event Event Type Default Event Handler 150 start of eclipse execution sepia_start 0 151 eclipse restart true 0 152 end of eclipse execution sepia_end 0 153 toplevel print prompt toplevel_prompt 2 154 toplevel start of query execution true 0 155 toplevel print values print_values 3 156 toplevel print answer tty_ask_more 2 157 error exit error_exit 0 158 toplevel entering break level start_break 3 159 toplevel leaving break level end_break 3 These events are not errors but rather hooks to allow users to modify the behaviour of the ECL PS toplevel Therefore the arguments that are passed to the handler are not the erroneous goal and the
42. N The number of stack garbage collections performed during this ECL PS session statistics gc_ collected Bytes The amount of global stack space reclaimed by all the garbage collections in bytes statistics gc_area Bytes The average global stack area that was scanned by each garbage collection This number should be close to the selected gc_interval if it is much larger gc_interval should be increased statistics gc_ ratio Percentage The average percentage of garbage found and reclaimed by each garbage collection If this ratio is low gc_interval should be increased statistics gc_time Seconds The total cputime spent during all garbage collections Predicates related to the dictionary collector are set_flag gc_ interval dict N Specify that the dictionary collector should be invoked after N new dictionary entries have been made statistics dict_gc_ number N The number of dictionary garbage collections performed dur ing this ECL PS session statistics dict_gc_time Seconds The total cputime spent by all dictionary garbage collec tions 201 202 Chapter 20 Operating System Interface 20 1 Introduction ECL PS s operating system interface consists of a collection of built in predicates and some global flags that are accessed with set_flag 2 get_flag 2 and env 0 They are described in the following sections The interface is mostly compatible across Unix and Windows operating systems 20 2 Environmen
43. PA a 108 13 1 3 Events nd Wakin sae pri e a aa 110 13 1 4 Aborting an Execution with Events 000004 110 312 Errors Jarre ds Aa a de isa ala a eee 111 13 2 1 Error Handlers e s sauss id a Pak a dG a de 112 13 2 2 Arguments of Error Handlers e e 113 13 2 3 User Defined Errors e 114 13 3 Interrupts e Li hea E AA A be la Bie Pe tad a ed 13 3 1 Interrupt Identifiers 0 0 0 020200 002 eee eee 13 3 2 Asynchronous handling e 14 Debugging 14 1 14 2 14 3 14 4 14 5 14 6 14 7 14 8 The Box Models riesia e de fie Meta isk che es Ae at A Ih al E Format of the Tracing Messages oaa e Debugging related Predicate Properties 0 0 0 eee ee ee Starting the Debugger 2 2 ee Debugging Parts of Programs 2 2 e 14 5 1 Mixing debuggable and non debuggable code Using the Debugger via the Command Line Interface 14 6 1 Counters and Command Arguments e 14 6 2 Commands to Continue Execution o e e 14 6 3 Commands to Modify Execution e e 14 6 4 Display Commands 02000 eee ee ee ee 14 6 5 Navigating among Goals 2 aaa ee 14 6 6 Inspecting Goals and Data 0 0 000000 00 0004 14 6 7 Changing the Settings 2 2 2 0 0 o 14 6 8 Environment Commands 0 000 eee ee ee Extending the Debugger ee ee 14 7 1 User define
44. PP eee Loe EA 203 20 2 4 Time and Dat mms eee RE Bae ee a ea a 204 20 2 5 Host Computer 204 20 2 6 Calling C Functions e 204 203 File ystems ta fhe sal dere gi ne Seg a a BOS AS 204 20 3 1 Current Directory sch eot ae es Ses Ge a ef at etd 205 20 3 2 Looking at Directories ooa ee 205 20 3 3 Checking Piles sate ime ca Biter tee OR ee eee Ba eh ob Beale 205 20 3 4 Renaming and Removing Files e 205 20 3 0 Filenames s curas ia ep hE a ed Sige dt Be de eS 206 20 4 Creating Communicating Processes 2 0 ee o 206 204 1 Process Creation iaa Ay Bode ds a ol ee Be Aids ti ee 206 204 22 Process Control fateh aon Bay ke Oe Ge ea a a pe ete 207 20 4 3 Interprocess Signals 2 2 e o 208 21 Interprocess Communication 209 2131 Socket Domains Seif A RA E od ede Qe ee ED 209 21 2 Stream Connection internet domain ssp erro wee ae eR ER 209 21 3 Datagram Connection internet domain o 210 21 4 Stream Connection unix domain a ade Ge LS 214 21 5 Datagram Connection unix domain o e 215 22 Porting Applications to ECL PS 217 22 1 Using the compatibility language dialect 0 o o 217 22 1 1 Compiler versus Interpreter e 217 22 2 Porting Programs to plain ECL PSE aria id pe OEE de 218 22 3 Exploiting ECL PS Features 4 4 a8 sa a dede sb 219 A Syntax 221 AT Introduction inia Ln ld Aa E tb 221 A2 Not
45. The system does not check if the attribute that corresponds to a given handler is instantiated or not this means that the handler must check itself if the attributed variable contains any attribute information or not For instance if an attributed variable X a _ b _ c f a is unified with the attributed variable Y a _ b _ c f b the handlers for the attributes a and b should treat this as binding of two plain variables because their attributes were not involved Only the handler for c has any work to do here The library suspend pl can be used as a template for writing attributed variable handlers The following operations invoke attributed variable handlers e unify the usual unification The handler procedure is unify_handler Term Attribute SuspAttr The first argument is the term that was unified with the attributed variable it is either a nonvariable or an attributed variable The second argument is directly the contents of the 157 attribute slot corresponding to the extension i e it is not the whole attributed variable When this handler is invoked the attributed variable is already bound to Term The optional third argument is the suspend attribute of the former variable it may be needed to wake the variable s constrained suspension list If an attributed variable is unified with a standard variable the variable is bound to the attributed variable and no handlers are invoked If an attributed variable is unifie
46. This gives rise to the following trace p 1 1 CALL p gt creep 1 1 CLAUSE1 p gt creep S 2 2 CALL writeln hello gt creep hello S 2 2 EXIT writeln hello gt creep 3 2 CALL fail gt creep 3 2 FAIL fail gt creep 1 1 NEXT p gt creep 1 1 CLAUSE2 p gt creep 2 S 4 world S 4 2 EXIT writeln world gt creep 1 1 EXIT p gt creep Yes 0 00s cpu CALL writeln world gt creep Note that the additional ports share the parent s invocation number so the i command can be used to skip from one to the other 14 7 2 Attaching a Different User Interface The tracer consists of a trace generation component which is part of the ECL PS runtime kernel and a user interface which is part of the development system The standard ECL PS distribution contains two user interfaces a console based one and a graphical one which is part of tkeclipse A programmable tracer interface OPIUM LSD is under development in the group of Mireille Ducasse at IRISA Rennes Connecting new interfaces is relatively easy for more detailed information contact the ECL PS development team 14 8 Switching To Creep Mode With CTRL C When the debugger is on and a program is running typing CTRL C prompts for input of an option The d option switches the debugger to creep mode and continues executing the interrupted program The debugger will then stop at the next port of the running program eclipse 1 de
47. This sets up a series of after events specified in EventList which is list of events in the form EventId Time or EventId every Time specifying a single event or a repeated event respectively The Time parameter is actually the minimum of elapsed time before the event is raised Factors constraining the actual time of raising of the event include the granularity of the system clock and also that ECL PS must be in a state where it can synchronously process the event it needs to be where it can make a procedure call Once an after event has been set up it is pending until it is raised In the case of event_after_every 2 the event will always be pending because it is rasied repeatedly A pending event can be cancelled so that it will not be raised cancel_after_event EventId Cancelled This finds and cancels all pending after events with name EventId and returns the actually cancelled ones in a list 109 current after events Events This returns a list of all pending after events The after event mechanism allows multiple events to make use of the timing mechanism inde pendently of each other The same event can be setup multiple times with multiple calls to event_after 2 and event_after_every 2 The cancel_after_event 2 predicate will cancel all instances of an event By default the after event feature uses the real timer The timer can be switched to the virtual timer in which case the elapsed time measured is user CPU time This
48. ak SS 7 3 4 1 Compiling a progra 8 3 4 2 Executing query ve rta Palace Co bee a ESS 8 343 Editinera file s p caps Seite ad ee HE Sa kee bale Ae 9 3 4 4 Debugging a progra 9 34 5 Getting Helps irange d wat ieee KORE a ay i by 10 34 60 Oher tools ss 222 85 he 6 at ob ea Seek Ged ed da a 10 3AT Preference Editor 3 2th cee hl A Ad Bw CS a 4 11 3 5 How do I use eclipse e 12 3 5 1 Getting started os 2 2244 4 40h Daa gee hw aoe oe a as e doa d 12 3 5 2 Interacting with the top level loop 04 12 3 5 9 Compilinga progran ces Yahya ee bk ee SE Eee EG e gaida a 12 3 5 4 Entering a program from the terminal 13 30 05 Executing a que4rys foe Gur oa 2 da e ti 13 3 5 6 Interrupting the execution saoo aa a 14 3 5 7 Debugging a program 2 0 14 3 5 8 The history mechanism a 15 35 9 Getting help us i odie vee eddies bbe e ee ed 15 3 6 How do I make things happen at compile time 15 3 7 How do I use ECL PS libraries in my programs 004 16 3 8 How do I make my programs run faster 2 2 ee ee 16 3 9 Other CIPSA oe SE eae PSG fa 17 3 9 1 Initialisation at start up aese da e 17 3 9 2 Recommended filenames 0 0000 eee eee 17 4 The TkECL PS Development Tools 4 1 Display Matrix 4 1 1 4 2 1 ECL PS specific Language Features 5 1 Structure Notation 5 1 1 Updating Structures 5 1 2 Arit
49. and print functor notation portrayed false do not use portray 1 2 portrayed true P call the user defined predicate portray 1 2 for printing quoted false do not print quotes around strings or atoms quoted true Q quote strings and atoms if necessary transform true apply portray transformations write macros transform false T do not apply portray transformations write macros variables default print variables using their source name if available variables raw v print variables using a system generated name e g _123 variables full V print variables using source name followed by a number e g Alpha_132 variables anonymous print every variable as a simple underscore Overview of term output options see write_term 3 for more details The write_term 2 and write_term 3 predicates print a single ECL PS term and accept a list of output options first column in the table 10 4 1 The printf 2 and printf 3 predicates are similar to C s printf 3 function but provide ad ditional format characters for printing ECL PS terms The basic format string for printing arbitrary terms is w Additional format characters can go between and w according to 92 the second column in the table 10 4 1 For example the following pairs of printing goals are equivalent printf mw X lt gt write_term X attributes pretty printf 0 w X lt gt write_term X operators false dotlist true printf
50. and thus they incur no overhead When the clauses are not disjoint because of the type tests either a cut after the test or more tests into the other clauses can be added For example the following procedure will be recognised as deterministic and all tests are optimised away a procedure without cuts p X var X p X atom X integer X X C1 p X nonvar X X 1 15 p X nonvar X X Another example A procedure with cuts p X _ p X var X p X integer X p X real X p HIT PELI rs Integers less than or greater than a constant can also be recognised by the compiler p X integer X X lt 5 POL tS es PCS sa p X integer X X gt 15 If the clause contains tests of several head arguments only the first one is taken into account for indexing Here are some more hints for efficient coding with ECL PS e Arguments which are repeated in the clause head and in the first regular goal in the body do not require any data moving and thus they do not cost anything For example p x Y Z T U 7 q x Yas Z T U 50 is as expensive as p q On the other hand switching arguments requires data moves and so p A B C q B C A is significantly more expensive e When accessing an argument of a structure whose functor is known unification is better than arg 3 Note however that for better maintainability the structure notati
51. as well as adding new files Predicate Browser This tool allows you to browse through the modules and predicates which have been compiled in the current session It also lets you alter some properties of compiled predicates Source Viewer This tool attempts to display the source code for predicates selected in other tools Delayed Goals This tool displays the current delayed goals as well as allowing a spy point to be placed on the predicate and the source code viewed Tracer As discussed in section 3 4 4 the tracer is useful for debugging programs See also chapter 14 10 Inspector This tool provides a graphical browser for inspecting terms Goals and data terms are displayed as a tree structure Sub trees can be collapsed and expanded by double clicking A navigation panel can be launched which provides arrow buttons as an alternative way to navigate the tree Note that while the inspector window is open interaction with other TkECL PS windows is dis allowed This prevents the term from changing while being inspected To continue TkECL PSS the inspector window must be closed Global Settings This tool allows the setting of some global flags governing the way ECL PS behaves See also the documentation for the set_flag 2 and get_flag 2 predicates Statistics This tool displays some statistics about memory and CPU usage of the ECL PS system up dated at regular intervals See also the documentation for the statisti
52. atom 3 atom 1 50 atom_string 2 39 atomic 3 atomic 1 50 atoms 38 attach_suspensions 2 179 attach_tools 0 23 attached 1 25 attribute 178 specification qualified 156 unqualified 156 attributed variable 224 attributed variables 155 163 handlers 157 b break debugger cmd 138 B Move current subterm down by N levels debugger cmd 133 backtracking 13 bag_abolish 1 198 bag_create 1 76 bag_dissolve 2 76 bag_enter 2 76 bag_retrieve 2 76 bags 198 bb_min 3 175 bignum 68 bind 2 211 block 3 113 119 242 Blocks 113 body 5 bounded reals 68 break 0 138 breal 68 breal 1 50 breal 2 69 buffered output 89 253 bug reports 2 c creep debugger cmd 125 C Move current subterm right by N posi tions debugger cmd 132 call 1 47 123 call_c 2 204 call_priority 2 180 callable term 3 caller module 63 cancel_after_event 2 109 ccompile coverage 151 152 ccompile 1 151 ccompile 2 152 cd 1 205 character class 88 221 character lists 37 CHIP 1 choicepoint 199 clause 3 5 goal 4 head 4 iterative 3 matching 39 program 5 regular 3 termination 13 unit 4 clause 1 2 218 code coverage 143 command line options 203 245 246 b 245 e 245 comment directive 247 comment 2 145 compare_instances 3 158 compare_instances handler 158 comparison arithmetic 67 compilation nesting compile commands 15 compile 1 12 17 45 62 1
53. attribute specification 156 query 5 13 15 rational numbers 68 rational 1 50 rational 2 69 read macros 99 read mode 83 read 1 62 83 88 99 read 1 2 88 read 2 45 88 read_directory 4 205 read_string 3 88 read_string 3 4 39 read_string 4 88 read_term 2 88 read_term 3 88 read_token 2 87 222 read_token 3 87 222 read_directory 4 205 readvar 3 88 238 real 1 50 record 2 62 redefinition error 58 redefinition warning 58 redirecting streams 86 reexport 1 60 reference 75 80 Reference Manual 151 154 rename 2 205 reset_error_handlers 0 112 reset_event_handler 1 112 resolvent 165 result coverage 152 result 1 152 retract 1 95 97 198 rightarrow key Move current subterm right by N positions debugger cmd 132 runtime system 56 s skip debugger cmd 125 scattered library 43 schedule_suspensions 1 179 schedule_suspensions 2 178 179 seek 2 45 89 90 SEPIA 1 set_chtab 2 39 222 229 set_event_handler 2 108 112 243 set_flag 2 11 16 17 123 198 203 set_flag 3 121 124 set_interrupt_handler 2 208 set_stream 2 6 84 86 set_stream_property 3 87 89 93 set_suspension_data 3 177 set_var_bounds 3 159 set_bounds handler 159 set_event_handler 2 108 112 set_flag 2 200 set_interrupt_handler 2 115 set_stream 2 6 setarg 3 81 157 setof 3 51 123 175 setval 2 78 81 setval 2 getval 2 219 sh 1 206 207 shared heap 198 shelf 76
54. caller module but defined as follows Event Second Argument Third Argument 150 A free variable If the handler binds the variable undefined to an atom this name is used as the toplevel module name 151 undefined undefined 152 The argument is the number that ECL PS will undefined return to the operating system 153 current toplevel module current toplevel module 154 a structure of the form current toplevel module goal Goal VarList NewGoal NewVarList where Goal is the goal that is about to be exe cuted and VarList is the list that associates the variables in Goal with their names like in read var 3 NewGoal and NewVarList are free vari ables If the handler binds NewVarList then the toplevel will use NewGoal and NewVarList to replace Goal and VarList in the current query 238 Event Second Argument Third Argument 155 A list associating the variable names with their current toplevel module values after the query has been executed 156 An atom stating the answer to the query that current toplevel module was just executed The possible values are yes last_yes or no if the query had no vari ables more_answers last_answer if the query contained variables and bindings were printed no_answer if a query containing variables failed 157 undefined undefined 158 break level current toplevel module 159 break level current toplevel module When the handler for event 152 end of eclipse execution calls exit_block ECL
55. can then be applied to a string as follows eclipse 1 String prolog is great open String string S phrase sentence S 0 S End End 15 yes Here is another redefinition of C 3 using a similar idea which allows the direct parsing of ECL PS strings as sequences of characters local C 3 C String PosO Char String Pos1 PosO lt string_length String string_code String Pos0 Char Posi is Pos0 1 anagram gt anagram gt _ anagram gt C anagram C This can then be applied to a string as follows 105 eclipse 1 phrase anagram abba 1 abba 5 yes eclipse 2 phrase anagram abca 1 abca 5 no more solution Unlike the default definition these redefinitions of C 3 are not bi directional Consequently the grammar rules using them can only be used for parsing not for generating sentences Note that every grammar rule uses that definition of C 3 which is visible in the module where the grammar rule itself is defined 106 Chapter 13 Events and Interrupts The normal execution of a Prolog program may be interrupted by Events and Interrupts Events they may occur asynchronously posted by the environment or synchronously raised by the program itself they are handled synchronously by a handler goal that is inserted into the resolvent e the handler can cause the interrupted execution to fail or to abort e the
56. contents They read the next token from the current input stream unify it with Token and its token class is unified with Class A token is either a sequence of characters with the same or compatible character class e g ab_1A then it is a Prolog constant or variable or a single character e g The token class represents the type of the token and its special meaning e g fullstop comma open_par etc The exact definition of character classes and tokens can be found in appendices A 2 1 and A 2 3 respectively A further very flexible possibility to read a sequence of characters is provided by the built ins read_string 3 and read_string 4 read_string Delimiters Length String read_string Stream Delimiters Length String Here the input is read up to a specified delimiter or up to a specified length and returned as an ECL PS string In particular one line of input can be read as follows read_line Stream String read_string Stream end_of_line _Length String Once a string has been read string manipulation predicates like split_string 4 can be used to break it up into smaller components 10 2 3 Term I O The read 1 2 and write 1 2 predicates correspond to the third way of looking at streams For input the goal read Term reads the next ECL PS term from the current input stream and unifies it with Term The input term must be followed by a full stop that is a character followed by a layout charact
57. contents of the file and start writing at its end Stream is a symbolic stream identifier or an uninstantiated variable If it is uninstantiated the system will bind it to an identifier the stream number eclipse 1 open new_file write Stream Stream 6 yes Tf the stream argument is an atomic name this name becomes an alias for the hidden stream number eclipse 1 open new_file write new_stream yes The stream identifier symbolic or numeric may then be used in predicates which have a named stream as one of their arguments For example open foo update Stream write Stream subject close Stream 85 will write the atom subject to the file foo and close the stream subsequently It is recommended style not to use symbolic stream names in code that is meant to be reused This is because the stream names are global there is the possibility of name clashes and the code will not be reentrant It is cleaner to open streams with a variable for the stream identifier and pass the identifier as an argument wherever it is needed Socket streams are not opened with open 3 but with the special primitives socket 3 and accept 3 More details are in chapter 21 A further group of primitives which open streams implicitly is exec 2 exec 3 and and exec_group 3 They open pipes which connect directly to the I O channels of the executed process See chapter 20 for details 10 1 4 Closing Streams The predicat
58. detail 9 e the delayed goals browser available by selecting the Delayed Goals option from the Tools menu which allows you to inspect the current list of delayed goals e the display matrix available either from calls in user s code or by interactively selecting terms to be observed from the inspector tracer or delay goals tools which allows you to monitor any changes to a term and its arguments More information about debugging in ECL PS may be found in chapter 14 3 4 5 Getting help More detailed help than is provided here can be obtained online for all the features of TkECL PS Simply select the entry from the Help menu on TkECL PS s top level window which corresponds to the topic or tool you are interested in 3 4 6 Other tools TkECL PS comes with a number of useful tools Some have been mentioned above but here is a more complete list Note that we only provide brief descriptions here for more details please see the online help for the tool in question Compile scratch pad This tool allows you to enter small amounts of program code and have it compiled This is useful for quick experimentation but not for larger examples or programs you wish to keep since the source code is lost when the session is exited Source File Manager This tool allows you to keep track of and manage which source files have been compiled in the current ECL PS session You can select files to edit them or compile them individually
59. dynamic memory area than the global stack That means that once an atom has been entered there this space will only be reclaimed by a relatively expensive dictionary garbage collection It is therefore in general not a good idea to have a program creating new atoms dynamically at runtime Atoms should always be preferred when they are involved in unification and matching As opposed to strings they can be used for indexing clauses of predicates Consider the following example eclipse 1 user afather mary george afather john george afather sue harry afather george edward sfather mary george sfather john george sfather sue harry sfather george edward user compiled 676 bytes in 0 00 seconds yes eclipse 2 afather sue X X harry yes eclipse 3 sfather sue X X harry More no more solution The predicate with atoms is indexed that means that the matching clause is directly selected and the determinacy of the call is recognised the system does not prompt for more solutions When the names are instead written as strings the system attempts to unify the call with the first clause then the second and so on until a match is found This is much slower than the indexed access Moreover the call leaves a choicepoint behind as shown by the more prompt 38 Conclusion Atoms should be used for representing naming the items that a program reasons about much lik
60. example the display matrix predicates can be used as in TkECL PS Also the tracer tool replaces the previous tracing facilities of the ECL PS session this would typically be the command line debugger The tools can be triggered by events in the ECL PS session as described above In order to use the tools in a more interactive way control should be handed over to the remote tools This can be done by calling the tools 0 predicate When the remote tools have control the user can now interactively select development tools from the Tools menu The remote_tools library provides several predicates to facilitate the use of the remote develop ment tools tools Explicitly hands over control to the remote development tools The tools window can then be used interactively Execution on the ECL PS session is suspended until the remote tools allows ECL PS to resume at which point the predicate succeeds The predicate will abort if the development tools is disconnected from the ECL PS session 24 attached ControlStream Checks if the remote development tools have been attached to this ECL PS session or not If attached the predicate succeeds and unifies ControlStream with the stream name of the control stream If not attached th predicate fails Once attached the remote development tools should be connected until the user quits the session Although it is possible to disconnect the tools from the ECL PS session from the File menu in the
61. for based integers is instead INTBAS SGN O b o x N LC UC which allows binary octal and hexadecimal numbers respectively c character codes INTCHAR SGN O AQ RA ANY AS ANY The value of the integer is the character code of the last character d rationals RAT SGN N UL N e floats FLOAT SGN N N e E SGN N Inf SGN N e E SGN N checks are performed that the numbers are in a valid range f bounded reals BREAL FLOAT UL UL FLOAT where the first float must be less or equal to the second If the syntax option blanks_after_sign is active then blank space BS is allowed between the sign and the following digits 3 strings STRING SQ NES ES ANY SQ BS SQ SQ By default consecutive strings are concatenated into a single string This behaviour can be disabled by the syntax option doubled_quote_is_quote which causes doubled quotes to be interpreted as a single occurrence of the quote within the string 4 lists of character codes LIST LQ NES ES ANY LQ BS LQ LQ By default consecutive character lists are concatenated into a single character list This behaviour can be disabled by the syntax option doubled_quote_is_quote which causes doubled quotes to be interpreted as a single occurrence of the quote within the string 223 Variables VAR UC UL ALPx End of clause EOCL BS NL lt end of file gt lt end of file gt
62. goal This is needed for example when the handler wants to call the culprit reliably using a qualified call via 2 The error handler is free to ignore some of these arguments i e it can have any arity from 0 to 4 The first argument is provided for the case that the same procedure serves as the handler for several error types then it can distinguish which is the actual error type An error handler is just an ordinary Prolog procedure and thus within it a call may be made to any other procedure or any built in predicate this in particular means that a call to exit_block 1 may be made see the section on the block 3 predicate This will work through the call to the error handler and so an exit may be made from within the handler out of the current block i e back to the corresponding call of the block 3 predicate Specifying the predicates true 0 or fail 0 as error handlers will make the erroneous predicate succeed without binding any further variables or fail respectively The following two templates are the most common for error handlers The first simply prints an error message and aborts my_error_handler ErrorId Goal ContextModule printf error Error w in w in module w n ErrorId Goal ContextModule abort The following handler tries to repair the error and call the goal again Note that some events are not errors but are used for different purposes In thoses cases the second and third argument are s
63. goals write hello yes eclipse 3 freeze p X Y write hello X Y X X Y X Delayed goals write hello 185 yes eclipse 4 freeze p X Y write hello Y 1 hello X X Y 1 However if its argument is ground it will still produce a suspended goal which may not be what we expect eclipse 5 8 freeze a write hello Delayed goals write hello yes To correct this problem we can test this condition separately freeze Term Goal nonground Term ls suspend Goal 3 Term gt inst freeze _ Goal call Goal and get the expected results eclipse 8 freeze a write hello hello yes Another possibility is to wait until a term becomes ground i e all its variables become instan tiated In this case it is not necessary to attach the suspension to all variables in the term The Goal has to be called when the last variable in Term is instantiated and so we can pick up any variable and attach the suspension to it We may then save some unnecessary waking when other variables are instantiated before the selected one To select a variable from the term we can use the predicate term_variables 2 which extracts all variables from a term However when we already have all variables available we can in fact dispose of Term which may be huge and have a complicated structure Instead we pick up one variable from the list until we reach its end wait_for_ground Term Goal term
64. gt A handler for a named event can have zero or one arguments When invoked the first argument is the event identifier in this case the atom hello It is not possible to pass other information to the handler The handler for a defined event can be queried using get_event_handler 3 Creating Anonymous Events An anonymous event is created with the builtin event_create 3 event_create my_other_handler Event The builtin takes a handler goal and creates an anonymous event handle Event This handle is the only way to identify the event and therefore must be passed to any program location that wants to raise the event The handler goal can be of any arity and can take arbitrary arguments Typically these arguments would include the Event handle itself and other ground arguments variables should not be passed because when the event is raised a copy of the handler goal with fresh variables will be executed 13 1 2 Raising Events Events can be raised in the following different ways e Explicitly by the ECL PS program itself using event 1 e By foreign code C C using the ec_post_event function Via signals interrupts by setting the interrupt handler to event 1 Via I O streams e g queues can be configured to raise an event when they get written into Via timers so called after events Raising Events Explicitly To raise an event from within ECL PS code call event 1 with the event identifier as its a
65. handler can interact with the interrupted execution only via nonlogical features e g global variable or references e the handler can cause waking of delayed goals via symbolic triggers Errors Errors can be viewed as a special case of events They are raised by built in predicates e g when the arguments are of the wrong type and usually pass the culprit goal to the error handler Interrupts Interrupts usually originate from the operating system e g on a Unix host signals are mapped to ECL PS interrupts e they occur asynchronously but may be mapped into a sychronous event e certain predefined actions like aborting can be performed asynchronously 13 1 Events 13 1 1 Event Identifiers and Event Handling Events are identified by names atoms or by anonymous handles When an event is raised a call to the appropriate handler is inserted into the resolvent the sequence of executing goals The handler will be executed as soon as possible which means at the next synchronous point in execution which is usually just before the next regular predicate is invoked Note that there are a few built in predicates that can run for a long time and will not allow handlers to be executed until they return e g read 1 sort 4 107 Creating Named Events A named event is created by defining a handler for it using set_event_handler 2 set_event_handler hello my_handler 1 my_handler Event lt code to deal with Event
66. instead 22 2 Porting Programs to plain ECL PS If you want to use ECL PS to do further development of your application it is probably advantageous to modify it such that it runs under plain ECL PS In the following we summarise the main aspects that have to be considered when doing so e In general it is almost always possible to add to your program a small routine that fixes the problem rather than to modify the source of the application in many places E g name clashes are easier fixed by using the local 1 declaration rather than to rename the clashing predicate in the whole application program e Due to lack of standardisation some subtle differences in the syntax exist between Prolog systems See A 4 for details ECL PS has a number of options that make it possible to configure its behaviour as desired e ECL PS has the string data type which is not present in Prolog of the Edinburgh family Double quoted items are parsed as strings in ECL PS while they are lists of integers in other systems and when the compatibility packages are used cf chapter 5 4 e I O predicates of the see and tell group are not builtins in ECL PS but they are provided in the cio library Call 1ib cio in order to have them available cf appendix A Similarly for numbervars 3 e In ECL PS some builtins raise events in cases where they just fail in other systems e g arg 1 2 X fails in C Prolog but raises a type error in ECL PS If some c
67. is the next integer after X If we want the predicate to act as a lazy test we need to let it suspend until both variables are instantiated This can be programmed as follows succ_lazy X Y var X gt suspend succ_lazy X Y 0 X gt inst var Y gt suspend succ_lazy X Y 0 Y gt inst Y X 1 Jis The conjunctive condition wait until X and Y are instantiated is implemented by first waiting for X s instantiation then waking up and re suspending waiting for Y s instantiation A more eager implementation of succ 2 would delay only until a single variable argument is left and then compute the variable from the nonvariable argument succ_eager X Y var X gt var Y gt suspend succ_eager X Y 0 X Y gt inst X is Y 1 Y is X 1 Here we suspend only in the case that both arguments are variables and wake up as soon as either of them gets instantiated Waiting for groundness of a term can be done in a way similar to the way succ_lazy 2 waited for both arguments to be instantiated we pick any variable in the nonground term and wait for its instantiation If this happens we check whether other variables remain and if yes we re suspend on one of the remaining variables The following predicate waits for a term to become ground and then calls arithmetic evaluation on it eval_lazy Expr Result nonground Expr Var gt suspend eval_lazy Expr Result 0 Var gt inst Result
68. issued for a term that does not have a structure definition an error would be reported INSPECT f 1 gt structure definition No struct definition for term f 1 eclipse h gt Show subterm path As the user navigates into a term then at each level a particular argument position or attribute in the case of attributed variables is selected at each level The user can view the position the current subterm is at by the p command For example 1 1 CALL foo a g b 1 21 3 gt 2 lt NL gt g b 1 21 INSPECT g 2 gt 2 lt NL gt 1 2 INSPECT list 1 head 2 tail gt 1 lt NL gt INSPECT integer gt p Subterm path 2 2 1 gt The subterm path shows the argument positions taken at each level of the toplevel term to reach the current subterm starting from the top Extra information in addition to the numeric argument position will be printed if the subterm at a particular level is either a structure with field names or an attributed variable For example local struct capital city country eclipse 8 suspend capital london C 3 C gt inst f capital london C 135 2 1 CALL f capital london C gt 1 lt NL gt capital london C INSPECT struct capital 2 gt 2 lt NL gt C INSPECT attributes 1 suspend gt 1 lt NL gt suspend SUSP 1 susp _244 _244 O INSPECT struct suspend 3 gt 1 lt NL gt SUSP 1 susp _244 _244 INSPECT 2 gt Sub
69. list but also to build a new list during an iteration For example main foreach X 1 2 3 foreach Y Negatives do Y is X writeln Negatives will print 1 2 3 The general form of a do loop is IterationSpecs do Goals and it corresponds to a call to an auxiliary recursive predicate of the form do__n do__n Goals do__n The IterationSpecs determine the number of times the loop is executed i e the termination condition and the way information is passed into the loop from one iteration to the next and out of the loop IterationSpecs is one or a comma separated sequence of the following fromto First In Out Last iterate Goals starting with In First until Out Last In and Out are local variables in Goals For all but the first iteration the value of In is the same as the value of Out in the previous iteration foreach X List iterate Goals with X ranging over all elements of List X is a local variable in Goals Can also be used for constructing a list foreacharg X Struct iterate Goals with X ranging over all elements of Struct X is a local variable in Goals Cannot be used for constructing a term foreacharg X Struct Idx same as before but Idx is set to the argument position of X in Struct i e arg Idx Struct X is true Idx is a local variable in Goals foreachelem X Array like foreacharg 2 but iterates over all elements of an array of arbitrary dimension The ord
70. need to use an editor to write your programs ECL PS does not come with an editor but any editor that can save plain text files can be used Save your program as a plain text file and you can then compile the program into ECL PS and run it With TkECL PS you can specify the editor you want to use and this editor will be started by TkECL PS e g when you select a file in the Edit option under the File menu The 7 ammam ECLiPSe 5 8 Toplevel Fle Query Tools Help eclipse gt Results F 50 There are 9 delayed goals Yes 1 99s cpu solution 1 maybe more do UUUUUU Z Output and Error Messages ic kernel eco loaded traceable 0 bytes in 0 03 seconds linearize eco loaded traceable 0 bytes in 0 03 seconds ordset eco loaded traceable 0 bytes in 0 02 seconds ic_constraints eco loaded traceable 0 bytes in 0 12 seconds ic eco loaded traceable 0 bytes in 0 01 seconds ic_generic_interface eco loaded traceable 0 bytes in 0 03 seconds ic_search eco loaded traceable 0 bytes in 0 09 seconds ic eco loaded traceable 0 bytes in 0 26 seconds farm ecl compiled traceable 3724 bytes in 0 26 seconds Figure 3 1 TkECL PS top level default values are the value of the VISUAL environment variable under Unix or Wordpad under Windows This can be changed with the Preference Editor under the Tools menu 3 4 1 Compiling a program From the File menu select the Compile option This will bring up a file selectio
71. not affected by the pragma Pragmas which have the same effect as global flags override the global flags if they specify more optimized code For instance the pragma debug has no effect if the global flag debug_compile is off but the pragma nodebug overrides the global flag debug_compile being on The pragmas are useful mainly for libraries and other programs that should be always compiled in a particular mode independently of the global flags setting 6 9 Writing Efficient Code The ECL PS compiler tries its best however there are some constructs which can be compiled more efficiently than others On the other hand many Prolog programmers overemphasize the 48 importance of efficient code and write completely unreadable programs which can be only hardly maintained and which are only marginally faster than simple straightforward and readable programs The advice is therefore Try the simple and straightforward solution first The second rule is to keep this original program even if you try to optimise it You may find out that the optimisation was not worth the effort To achieve the maximum speed of your programs you must produce the optimised code with the flag debug_compile being off e g by calling set_flag debug_compile off or using the pragma nodebug Setting the flag variable_names can also cause slight performance degradations and it is thus better to have it off unless variable names have to be kept Unlike in the previous rele
72. of operation First when a fragment of a built in name is specified a list of short descriptions of all built ins whose name contains the specified string is printed For example help write will print one line descriptions about write 1 writeclause 2 etc When a unique specification is given the full description of the specified built in is displayed e g in help write 1 3 6 How do I make things happen at compile time A file being compiled may contain queries These are goals preceded by either the symbol or the symbol As soon as a query or command is encountered in the compilation of a file the ECL PS system will try to satisfy it Thus by inserting goals in this fashion things can be made to happen at compile time In particular a file can contain a directive to the system to compile another file and so large programs can be split between files while still only requiring a single simple command to compile them When this happens ECL PS interprets the pathnames of the nested compiled files relative to the directory of the parent compiled file if for example the user calls eclipse 1 compile src pl prog and the file src pl prog pl contains a query parti part2 then the system searches for the files part1 pl and part2 pl in the directory src pl and not in the current directory Usually larger ECL PS programs have one main file which contains only commands to compile all the subfi
73. other untried alternative The instantiations shown in the EXIT port are the ones at exit time they result from the successful execution of the procedure FAIL When a clause of a procedure fails because head unification failed or because a sub goal failed the flow of the execution exits the clause box and leaves the procedure box via the FAIL port Note that the debugger cannot display any argument information at FAIL ports an ellipsis is displayed instead for each argument NEXT If a clause fails and there is another possibly matching clause to try then that one is tried for unification The flow of the execution from the failure of one clause to the head unification of a following clause is traced as a NEXT port The displayed variable instantiations are the same as those of the corresponding CALL or REDO port ELSE This is similar to the NEXT port but indicates that the next branch of a disjunction 2 it tried after the previous branch failed The predicate that gets displayed with the port is the predicate which contains the disjunction the immediate ancestor REDO When a procedure box is exited trough an EXIT port the box can be retried later to get a new solution This will happen when a later goal fails The backtracking will cause failing of all procedures that do not have any alternative then the execution flow will enter a procedure box that an contains alternative through a REDO port Two situations may occur
74. owner size inode number of links as well as creation access and modification times as defined by the UNIX system call stat 2 not all entries are meaningful under Windows and accessibility information It fails when the specified file does not exist Refer to the reference manual or help 1 for details 20 3 4 Renaming and Removing Files For these basic operations with files rename 2 and delete 1 are provided 205 20 3 5 Filenames The filenames used by ECL PS is in the Unix format including on Window platforms with the addition that the disk such as C is indicated by C so a Windows filename such as C my path name ecl should be writen as C my path name p1 The utility os_file name 2 provides for the interconversion between the format used in ECL PS and the Operating Systems format The utility pathname 4 is provided to ease the handling of filenames It takes a full pathname and cuts it into the directory pathname the filename proper and a suffix the part beginning with the last dot in the string It also expands symbolic pathnames starting with user or var eclipse 1 Name octopus prolog file pl pathname Name Path File Suffix Path usr octopus prolog File file pl Name octopus prolog file pl Suffix pl yes 20 4 Creating Communicating Processes ECL PS provides all the necessary built ins needed to create UNIX processes and establish communication betwe
75. pair here the suspending is simplified to use only the bound list e The continuations are just other pairs in the list so that no special treatment is necessary e When the variables suspended upon are instantiated to compound terms the new terms are again scanned by equal_arg 4 but the new continuations are prepended to the list As a matter of fact it does not matter if we put the new pairs at the beginning or at the end of the list but tracing is more natural when we use the fifo format e If this list of pairs is exhausted it means that no potentially non matching pairs were found the two terms are identical and thus the predicate fails note that this is achieved by a matching clause for diff_pairs 2 which fails if its first argument is a free variable e Note the optimisation for lists in equal_terms 4 If one term is a list we pass it directly to equal_lists 4 instead of decomposing each element with functor 3 Obviously this optimisation is applicable only if the input terms are known not to contain any pairs which are not proper lists dif2 T1 T2 equal_args T1 T2 List Link 189 gt diff_pairs List Link d2if _ _ succeed if already different equal_args A1 A2 L L A1 A2 equal_args A1 A2 A1 A2 Link Link var A1 var A2 1 equal_args A1 A2 List Link equal_terms A1 A2 List Link equal_terms T1 T2 List Link Ti _1_1 T2 Plo i equal_li
76. setting is specified by the ECL PS environment flag after_event_timer see get_flag 2 set_flag 2 Note that if the timer is changed while some after event is still pending these events will no longer be processed The timer should therefore not be changed once after events are initiated Currently the virtual timer is not available on the Windows platform In addition the user should should not make use of these timers for their own purpose if they plan to use the after event mechanism 13 1 3 Events and Waking Using the suspension and event handling mechanisms together a goal can be added to the resolvent and executed after a defined elapsed time To achieve this the goal is suspended and attached to a symbolic trigger which is triggered by an afer event handler The goal behaves logically in that if the execution backtracks pass the point in which the suspended goal is created the goal will disappear from the resolvent as expected and thus not be executed The event will still be raised but there will not be a suspended goal to wake up Note that if the execution finishes before the suspended goal is due to be woken up it will also not enter the resolvent and is thus not executed The following is an example for waking a goal with a timed event Once monitor X is called the current value of X will be printed every second until the query finishes or is backtracked over set_event_handler monvar trigger 1 monitor Var
77. shelf_abolish 1 198 shelf_create 2 76 shelf_create 3 76 shelf_get 3 76 shelf_set 3 76 shelves 198 simple goals 182 sin 2 72 singleton 247 singleton variables 44 skipped 1 121 123 socket streams 86 259 socket 3 84 86 209 soft cut 40 sort 2 51 source files 60 source transformation 99 SpecList 5 split_string 4 88 spy point 120 122 125 add 138 remove 138 spy 1 121 122 138 spy_term 2 126 spy_var 1 126 stack overflow 242 stacks 199 start_tracing 124 statistics 0 11 197 statistics 0 2 198 statistics 2 11 197 201 204 stderr 83 stdin 83 stdout 83 store 76 store 1 77 store_create 1 77 store_delete 2 77 store_erase 1 77 store_get 3 77 store_set 3 77 stored_keys 2 77 stored_keys_and_values 2 77 stream 6 streams 83 string 6 string 1 50 string_code 3 37 string length 2 72 string list 2 39 strings 37 struct 1 27 structure 6 55 224 structures 27 51 subcall 2 123 177 subscript 224 subscript 2 37 subscript 3 37 suspend 171 185 suspend library 167 suspend 3 119 169 170 174 175 178 suspend 3 4 176 suspend 4 119 suspended goal 165 suspending variables 170 181 suspension 176 179 creating 176 executed 177 sleeping 176 waking 177 suspension list 176 178 suspensions handler 158 suspensions 1 177 suspensions 2 158 symbolic waking condition 175 179 syntax 56 syntax differences of ECL PS 228 synt
78. slots or the shelf as a whole with shelf set 3 and retrieved with shelf _get 3 Example Counting how many solutions a goal has count_solutions Goal Total shelf_create count 0 Shelf call Goal shelf_get Shelf 1 Old New is Old 1 shelf_set Shelf 1 New fail shelf_get Shelf 1 Total 9 4 Stores A store is an anonymous object which can be used to store information across failures A typical application is aggregating information across multiple solutions Note that if it is not necessary 76 to save information across backtracking the use of the library hash is more appropriate and efficient than the facilities described here A store is a hash table which can store arbitrary terms under arbitrary ground keys Modifica tions of a store as well as the entries within it survive backtracking The basic operations on stores are entering and looking up information under a key or retrieving the store contents as a whole Stores come in two flavours anonymous stores are created with store_create 1 and referred to by handle while named stores are created with a store 1 declaration and referred to by their name within a module If possible anonymous stores should be preferred because they make it easier to write robust reentrant code For example an anonymous store automatically disappears when the system backtracks over its creation or when the store handle gets garbage collected Named stores on the othe
79. started To start ECL PS type the command eclipse at an operating system command line prompt This will display something like this eclipse ECLiPSe Constraint Logic Programming System kernel Kernel and basic libraries copyright Cisco Technology Inc Academic licensing through Imperial College London see legal licence_acad txt GMP library copyright Free Software Foundation see legal lgpl txt For other libraries see their individual copyright notices Version X Y Z DAY MONTH DD HH MM YYYY eclipse 1 The list in square brackets on the first line specifies the configuration of the running system i e the language extensions that are present The copyright and version information is followed by the prompt eclipse 1 which tells the user that the top level loop is waiting for a user query in the module eclipse The predicate help 0 gives general help and help 1 gives help about specific built in predicates 3 5 2 Interacting with the top level loop The ECL PS prompt eclipse 1 indicates that ECL PS is at the top level and the opened module is eclipse The top level loop is a procedure which repetitively prompts the user for a query executes it and reports its result i e either the answer variable bindings or the failure message There is always exactly one module opened in the top level and its name is printed in the prompt From this point it is possible to enter ECL PS goals e g to pose queries to enter an ECL PS p
80. strings is of the same order as comparing two lists but faster by a constant factor If a string is to be processed character by character this is easier to do using the list representation since using strings involves keeping index counters and calling the string_code 3 predicate The higher memory consumption of lists is sometimes compensated by the property that when two lists are concatenated only the first one needs to be copied while the list that makes up the tail of the concatenated list can be shared When two string are concatenated both strings must be copied to form the new one 37 Strings vs Atoms At a first glance an atom does not look too different from a string In ECL PS many predicates accept both strings and atoms e g the file name in open 3 and some predicates are provided in two versions one for atoms and one for strings e g concat_atoms 3 and concat_strings 3 However internally these data types are quite different While a string is simply stored as a character sequence an atom is mapped into an internal constant This mapping is done via a table called the dictionary A consequence of this representation is that copying and comparing atoms is a unit time operation while for strings both is proportional to the string length On the other hand each time an atom is read into the system it has to be looked up and possibly entered into the dictionary which implies some overhead The dictionary is a much less
81. terms are interpreted as clauses to be compiled A sequence of consecutive clauses whose heads have the same functor is interpreted as one procedure and so e g if the clauses of one procedure are mixed with directives or with clauses for another procedure the compiler takes them as several different procedures To allow the user to write non consecutive procedures the compiler raises an event whenever it encounters several procedures with the same name and arity in one file or when a procedure defined in one file is being redefined in another file Default action for the former is to emit a warning for the latter the new procedure just replaces the old one The library scattered redefines the former handler so that procedures which are scattered in one file are accepted as normal static procedures 6 2 Procedure Types Procedures can be static and dynamic and this feature can be queried with the stability flag of get_flag 3 Static procedures are compiled as one unit they are thus executed more efficiently and they can be modified only by replacing them by another procedure By contrast dynamic procedures are 43 compiled clause wise they are executed slightly less efficiently but their source form can also be retrieved and they can be modified by adding or removing single clauses or clause sequences By default all procedures are static dynamic procedures must be declared by the dynamic 1 declaration except that undefined procedures f
82. the attribute of a finite domain variable A 4 10000000 INSPECT attributes 1 suspend 2 fd gt 2 lt NL gt 4 10000000 INSPECT list 1 head 2 tail gt 1 lt NL gt 4 10000000 INSPECT 2 gt 2up subterm A 4 10000000 INSPECT attributes 1 suspend 2 fd gt lt o gt current output mode is QPm toggle char T new output mode is TQPm 136 A 4 10000000 INSPECT attributes 1 suspend 2 fd 7 gt 2 lt NL gt fd dom 4 10000000 9999997 O 0O INSPECT struct fd 4 gt 1 lt NL gt dom 4 10000000 9999997 INSPECT dom 2 gt After selecting the output mode T which turns off any output macros the internal form of the attribute is shown This allows previously hidden fields of the attribute to be examined by the subterm navigation Note that if the current subterm is inside a structure which will be changed by a changed output mode such as inside the fd attribute and the output mode is changed then until the current subterm is moved out of the structure the existing subterm path is still applicable Also after a change in output modes the current subterm will still be examining the structure that it obtained from the parent subterm Consider the finite domain variable example again 4 10000000 INSPECT 2 gt up subterm 4 10000000 sk printed structure 1 INSPECT list 1 head 2 tail 4 gt lt o gt current output mode is QPm toggle char T new output m
83. the chosen character to string_quote list_quote or atom_quote respectively To create a list quote which is not available by default one may use eclipse 1 set_chtab 0 list_quote yes eclipse 2 X text Y text type_of X TX type_of Y TY X 116 101 120 116 TX compound Y text TY string yes 5 5 Matching Clauses When Prolog systems look for clauses that match a given call they use full unification of the goal with the clause head but usually without the occur check Sometimes it is useful or necessary to use pattern matching instead of full unification i e during the matching only variables in the clause head can be bound the call variables must not be changed This means that the call must be an instance of the clause head The operator gt at the beginning of the clause body specifies that one way matching should be used instead of full unification in the clause head 39 p X gt q X Using the operator in the neck of the clause instead of is an alternative way of expressing the same so the following is equivalent to the above p X q X Pattern matching can be used for several purposes e Generic pattern matching when looking for clauses whose heads are more general than the call e Decomposing attributed variables 4 When an attributed variable occurs in the head of a matching clause it is not unified with the call argument w
84. the situations where the cut acts like a guard immediately after the clause neck or after a sequence of simple goals If the goals woken by the head unification or by the extended head are considered as constraints on the suspending variables the procedure will not behave as expected For example filter P 0 0 filter P NILI NINLIJ N mod P 1 O l filter P LI NLI filter P NILI NLI filter P LI NLI delay integers _ List if var List integers _ integers N N Rest Ni is N 1 integers N1 Rest integers 2 Ints filter 2 Ints X1 X2 The idea here is that integers 2 fills a list with integers on demand i e whenever new list elements appear Filter 3 is a predicate that removes all integers that are a multiple of P In the example query the call to integers 2 initially delays When filter 3 is called Ints gets instantiated in the head unification of the second clause of filter 3 which will wake up integers 2 However since the second clause of filter 3 has an extended head which extends up to the cut integers 2 will not actually be executed until after the cut Therefore N is not yet instantiated at the time of the arithmetic test and causes an error message The reason why delayed goals are woken after the cut and not before it is that neither of the two possibilities is always the intended or the correct one however when goals are woken before the cut there is no way to escape it a
85. their own needs and taste E 1 Style rules 1 2 10 11 12 13 There is one directory containing all code and its documentation using sub directories Filenames are of form a z a z_ with extension ecl One file per module one module per file Each module is documented with comment directives All required interfaces are defined in separate spec files which are included in the source with a comment include directive This helps to separate specification and implementation code The actual data of the problem is loaded dynamically from the Java interface for stand alone testing data files from the data directory are included in the correct modules The file name is equal to the module name Predicate names are of form a z a z_ 0 9 Underscores are used to separate words Digits should only be used at the end of the name Words should be English Variable names are of form A Z_ a zA Z 0 9 Separate words with capital letters Digits should only be used at the end Words should be English The code should not contain singleton variables unless their names start with _ The final program may not generate singleton warnings Each exported predicate is documented with a comment directive Clauses for a predicate must be consecutive Base clauses should be stated before recursive cases 247 14 15 16 17 18 19 20 21 22 23 24 25 26
86. this area and actually occupied by the ECL PS process The peak value indicates what was the maximum allocated amount during the session In the following we will discuss the six memory areas mentioned The gc figures are described in section 19 2 19 1 1 The Shared Private Heap The heap is used to store a variety of data compiled code The heap is used to store compiled Prolog code Consequently its size is increased by the various compile predicates the assert family and by load 1 Space is freed when single clauses retract or whole predicates abolish are removed from the system Note that space reclaiming is usually delayed in these cases see trimcore 0 since the removed code may still be under execution Erasing a module also reclaims all the memory occupied by the module s predicates nonlogical storage All facilities for storing information across backtracking use the heap to do so This includes the handle based facilities bags shelves as well as the name based facilities records nonlogical variables and arrays As a general rule when a stored term is overwritten the space for the old value is reclaimed All memory related to a nonlogical store is reclaimed when the store is destroyed e g using erase_array 1 erase_all 1 bag_abolish 1 shelf_abolish 1 dictionary The dictionary is the system s table of atoms and functors The dictionary grows whenever the system encounters an atom or functor that has not been ment
87. to capture the most common invocations of each predicate undergoing analysis Finally the results of the analysis are requested and the suggested mode annotations for each predicate are displayed The usage is as follows 1 Load the mode_analyser library 1ib mode_analyser 2 Compile your program with the mode analyser analyse queen 152 3 Run the query which most accurately exercises the invocation modes of the defined pred icates queen queen 1 2 3 4 0ut 4 Generate the results for the module into which the program was compiled result verbose on queen This will print the results as follows Mode analysis for queen qdelete 4 Results for argument 1 23 0 0 0 Results for argument 2 0 0 0 23 Results for argument 3 0 0 0 23 Results for argument 4 S210 0 23 0 qdelete Mode analysis for queen nodiag 3 Results for argument 1 a 0 0 0 62 Results for argument 2 40 0 0 62 Results for argument 3 0 0 0 62 nodiag Mode analysis for queen qperm 2 Results for argument 1 0 0 0 41 Results for argument 2 SaO 0 41 0 qperm Mode analysis for queen queen 2 Results for argument 1 a 0 0 1 Results for argument 2 1 0 0 0 queen 153 Mode analysis for queen safe 1 Results for argument 1
88. unify PredSpec with the specification of the current handler for error Errorld in the form Name Arity and HomeModule will be unified with the module where the error handler has been defined Note that this error handler might not be visible from every module and therefore may not be callable To re install the system s error handler in case the user error handler is no longer needed reset_event_handler 1 should be used reset_error_handlers 0 resets all error handlers to their default values To enable the user to conveniently write predicates with error checking the built ins error Errorld Goal error ErrorId Goal Module are provided to raise the error Errorld an error number or a name atom with the culprit Goal Inside tool procedures it is usually necessary to use error 3 in order to pass the caller module to the error handler Typical error checking code looks like this increment X X1 integer X gt Xi is X 1 error 5 increment X X1 dea The predicate current_error 1 can be used to yield all valid error numbers a valid error is that one to which an error message and an error handler are associated The predicate error_id 2 gives the corresponding error message to the specified error number To ease the search for the appropriate error number the library util contains the predicate util list_error Text N Message 3This is necessary because the compiler recognises simple predicates as deterministic at c
89. used to store information across failures A bag is unordered and untyped Any ECL PS term can be stored in a bag Bags are referred 79 to by a handle An empty bag is created using bag _create 1 data is stored in the bag by invoking bag_enter 2 and the stored data can be retrieved as a list with bag_retrieve 2 or bag_dissolve 2 A typical application is the implementation of the findall 3 predicate or similar functionality As opposed to the use of record 2 or assert 1 the solution using bags is more efficient more robust and trivially reentrant simple_findall Goal Solutions bag_create Bag call Goal bag_enter Bag Goal fail true bag_dissolve Bag Solutions 9 3 Shelves A shelf is an anonymous object which can be used to store information across failures A typical application is counting of solutions keeping track of the best solution aggregating information across multiple solutions etc A shelf is an object with multiple slots whose contents survive backtracking The content of each slot can be set and retrieved individually or the whole shelf can be retrieved as a term Shelves are referred to by handle not by name so they make it easy to write robust reentrant code A shelf disappears when the system backtracks over its creation when the shelf handle gets garbage collected or when it is explicitly destroyed A shelf is initialised using shelf create 2 or shelf create 3 Data is stored in the
90. value of the global reference is restored eclipse 4 setval a 1 setval a 2 getval a X getval a Y X 2 Y Y More X X Y 1 e there are no arrays of references but the same effect can be achieved by storing a structure in a reference and using the structure s arguments The arguments can then be accessed and modified using arg 3 and setarg 3 respectively The use of references should be considered carefully Their overuse can lead to programs which are difficult to understand and difficult to optimize Typical applications use at most a single reference per module for example to hold state that would otherwise have to be passed via additional arguments through many predicate invocations 81 82 Chapter 10 Input and Output 10 1 Streams Input and output in ECL PS is done via communication channels called streams They are usually associated with either a file a terminal a socket a pipe or in memory queues and buffers The streams may be opened for input only read mode output only write mode or for both input and output update mode 10 1 1 Predefined Streams Every ECL PS session has 4 predefined system streams stdin The standard input stream stdout The standard output stream stderr The standard error stream null A dummy stream output to it is discarded on input it always gives end of file In a stand alone ECL PS stdin stdout and stderr are connected to the corresponding stand
91. variable The attribute suspend is always present and defined by system coroutining 160 16 9 Examples of Using Attributed Variables 16 9 1 Variables with Enumerated Domains As an example let us implement variables of enumerable types using attributes We choose to represent these variable as attributed variables whose attribute is a enum 1 structure with a list holding the values the variable may take e g X enum a b c We have to specify now what should happen when such a variable is bound This is done by writing a handler for the unify operation The predicate unify_enum 2 defined below is this handler Its first argument is the value that the attributed variable has been bound to the second is the attribute that the bound attributed variable had keep in mind that the system has already bound the attributed variable to the new value We distinguish two cases First the attributed variable has been bound to another attributed variable 1st clause of unify_enum 2 In this case we form the intersection between the two lists of admissible val ues If it is empty we fail If it contains exactly one value we can instantiate the remaining attributed variable with this value Otherwise we bind it to a new attributed variable whose attribute represents the remaining admissible values Second when the attributed variable has been bound to a non variable the task that remains for the handler is merely to check if this binding
92. verb_phrase Number imperative you gt imperative gt noun_phrase Number gt determiner noun Number noun_phrase Number gt pronom Number verb_phrase Number gt verb Number verb_phrase Number gt verb Number noun_phrase _ determiner gt the noun singular gt man noun singular gt apple noun plural gt men noun plural gt apples verb singular gt eats verb singular gt sings verb plural gt eat verb plural gt sing pronom plural gt you The above grammar may be successfully parsed using phrase 3 If the predicate succeeds then the input has been parsed successfully eclipse 1 phrase sentence the man eats the apple yes eclipse 2 phrase sentence the men eat 103 yes eclipse 3 phrase sentence the men eats no eclipse 4 phrase sentence eat the apples yes eclipse 5 phrase sentence you eat the man yes The predicate phrase 3 may be used to return the point at which parsing of a grammar fails if the returned list is empty then the input has been successfully parsed eclipse 1 phrase sentence the man eats something nasty X X something nasty More no more solution eclipse 2 phrase sentence eat the apples X X the apples More X More no more solution eclipse 3 phra
93. whole attribute so that the attributed variable can be read back The printf 2 predicate has two options to be combined with the w format M forces the whole attributed variable to be printed together with all its attributes in the standard format so that it can be read back in With the m option the attributed variable is printed using the handlers defined for the print operation If there is only one handled attribute the attributed variable is printed as X Attr where Attr is the value obtained from the handler If there are several handled attributes all attributes are qualified like in X a A b B c C An attributed variable X m a with print handler 2 can thus be printed in different ways 1 e g printf w X m a or write X m a X print vMw X m a or writeq X m a _g246 suspend _g242 m a printf mw X m a X a printf Mw X m a X suspend _g251 m a printf Vmw X m a X_g252 a Write macros for attributed variables are not allowed because one extension alone should not decide whether the other attributes will be printed or not 16 8 Built Ins and Attributed Variables free Term This type checking predicate succeeds iff its argument is an ordinary free variable it fails if it is an attributed variable meta Term This type checking predicate succeeds iff its argument is an attributed variable For other type testing predicates an attributed variable behaves like a
94. 00 198 compile 1 2 238 compile 2 13 45 compile_stream 1 45 238 compile_term 1 45 251 compile_stream 1 45 compile_term 1 45 compiled_file 2 46 compiled_stream 1 46 compiled_file 2 46 compiler arithmetic 72 compiler macros 99 compound term 4 compound 1 50 connect 2 211 constrained 193 container 56 control stack 199 copy_term 2 78 158 251 copy_term_vars 3 158 copy_term handler 158 coroutining 171 185 arithmetic 73 count iterator construct 31 coverage 151 coverage counters 151 cputime 1 72 204 create_module 1 64 create_module 3 64 curly braces 27 current_after_events 1 110 current_array 2 79 current_compiled_file 3 45 current_error 1 112 current_interrupt 2 115 current_module 1 63 current_suspension 1 177 current_array 2 79 current_compiled_file 3 45 current_error 1 112 current_stream 1 86 cut 182 183 248 soft 40 cut warnings 183 cyclic terms 251 d delayed goals debugger cmd 127 D Move current subterm left by N posi tions debugger cmd 132 database 97 dbgcomp 0 123 254 DCG 102 dead code 248 debug 0 121 debug 1 123 debug_output 119 Debugger Commands 124 debugging 0 122 decval 1 78 79 default 0 115 definite clause grammar 102 definition 56 58 delay arithmetic 73 delay clauses 167 delayed_goals 1 177 delayed_goals 2 160 delayed_goals_number 2 159 delayed_goals handler 160 delayed_goals number handler 159
95. 1 21 3 INSPECT f00 3 gt down subterm 1 for 1 levels INSPECT atom gt 133 In the above example the down arrow key is typed at the top level and thus the argument position chosen for moving down is first argument with the default numeric argument for the If the argument position to move into is beyond the range of the current subterm s number of arguments then no move is performed 1 1 CALL foo a b c d e gt 3 lt NL gt c d e INSPECT c 2 gt Out of range after traversing down arg c d e INSPECT c 2 gt In this case the down arrow key was typed in the second trace line which had the current subterm at the third argument of its parent term and thus the command tries to move the new current subterm to the third argument of the current sub term but the structure does not have a third argument and so no move was made In the case of moving down multiple levels then the movement will stop as soon as the argument position to move down to goes out of range Moving down is particularly useful for traversing lists As discussed lists are really struc tures with arity two so the N command would not move to the N element of the list With the down arrow command it is possible to move into the N position in one command eclipse 30 foo 1 2 3 4 5 6 7 8 9 1 1 CALL foo 1 2 3 gt 1 lt NL gt 1 2 3 4 INSPECT list 1 head 2 tail gt 2 lt NL gt 2 3 4 5 INSPE
96. 11 Abstract Code Listing The built in predicate als 1 lists the abstract code of the given predicate and it can thus be used by experts to check if the predicate was compiled as expected 53 54 Chapter 7 Module System 7 1 Basics 7 1 1 Purpose of Modules The purpose of the module system is to provide a way to package a piece of code in such a way that e internals are hidden e it has a clearly defined interface e naming conflicts are avoided In particular this helps with e Structuring of large applications Modules should be used to break application programs into natural components and to define the interfaces between them e Provision of libraries All ECL PS libraries are modules Their interfaces are defined in terms of what the module makes visible to the world e Different implementations of the same predicate In constraint programming it is quite common to have different implementations of a constraint which all have the same declar ative meaning but different operational behaviour e g different amount of propagation using different algorithms exhibiting different performance characteristics The module system supports that by allowing to specify easily which version s of a predicate should be used in a particular context 7 1 2 What is under Visibility Control The ECL PS module system governs the visibility of the following entities Predicate names Predicates can always be used in the module wher
97. 12 for the input source 44 goal expansion Specifies whether to apply goal macros or not see Chapter 12 6 4 Compiler Input The compiler normally reads a file up to its end The file end can also be simulated with a clause end_of_file The file is normally read consecutively however the compiler uses the normal ECL PS I O streams and so if during the compilation the stream pointer is modified e g by seek 2 or read 2 the compiler continues at the specified place There are several built in predicates which invoke the compiler compile File This is the standard compiler predicate The contents of the file is compiled according to the current state of the global flags compile File Module This predicate is used to compile the contents of a file into a specified module without having to use the module declaration in the file itself include File This predicate is similar to the compile predicate except that it is treated as an in place inclusion of File by fcompile 1 see section 6 10 Like compile File can be a single file or a list of files compile_stream Stream This predicate compiles a given stream up to its end or to the end_of_file clause It can be used when the input file is already open e g when the beginning of the file does not contain compiler input or when the input has to be processed in a non consecutive way compile_term Clauses This predicate is used to compile a given term usually a list of cla
98. 16 user compiled optimized 396 bytes in 0 02 seconds yes eclipse 4 Section 6 9 contains more detailed discussion on other techniques which can be used to optimise your programs 3 9 Other tips 3 9 1 Initialisation at start up If you wish to have ECL PS do or execute things at startup time you can achieve this in TkECL PS by setting the initial query call in the Preference editor and in the command line eclipse by putting via a eclipserc file For eclipse before displaying the initial prompt the system checks whether there is a file called eclipserc in the current directory and if not in the user s home directory If such a file is found ECL PS compiles it first Thus it is possible to put various initialisation commands into this file ECL PS has many possibilities to change its default behaviour and setting up a eclipserc file is a convenient way to achieve this A different name for the initialisation file can be specified in the environment variable ECLIPSEINIT If ECLIPSEINIT is set to an empty string no initialisation is done If the system is started with a e option then the eclipserc file is ignored For TkECL PS the system will make the initial query call as set in the Preference Editor before giving control to the user This call can be set to compile an initialisation file This can be the eclipserc file or some other file if the user want to initialise the system differently in TkECL PS 3 9 2 Recomm
99. 3 sending to mimas8 sending to acrab23 sending to europal sending to europab sending to regulus2 sending to miranda5 sending to mimas2 sending to triton6 sending to europa2 sending to acrab7 sending to europa3 sending to sirius 213 sending to miranda6 sending to charon6 sending to acrab13 sending to tritonl sending to acrab20 sending to triton4 sending to charon2 sending to tritonb sending to acrab24 sending to acrab21 sending to scorpio sending to acrab14 sending to janusb yes leclipse 3 hello from mimas3 eclipse Command not found eclipse not installed here hello from regulus2 hello from mimas8 hello from acrab20 hello from europal hello from mimas2 hello from miranda6 hello from mirandad hello from europa3 hello from charon6 hello from charon2 hello from acrab24 hello from tritonb hello from acrab21 hello from janus5 hello from triton4 hello from triton6 hello from europa2 hello from europad hello from acrab23 hello from triton1 hello from acrab14 hello from acrab13 hello from acrab7 21 4 Stream Connection unix domain The sequence of operations is the same as for the internet domain however in the unix domain the socket addresses are the file names server 214 eclipse 10 socket unix stream s bind s tmp sock yes eclipse 11 listen s 1 accept s _ news lt blocks waiting for a connection gt client eclipse 26 socket unix stream s connect s t
100. 3 0 are all different Use the arithmetic comparison predicates when you want to compare numeric values When numbers of different types occur as arguments of an arithmetic operation or comparison the types are first made equal by converting to the more general of the two types i e the rightmost one in the sequence integer rational float bounded real The operation or comparison is then carried out with this type and the result is of this type as well unless otherwise specified Beware of the potential loss of precision in the rational float conversion Note that the system never does automatic conversions in the opposite direction Such conversion must be programmed explicitly using the fix rational float and breal functions 8 3 Arithmetic Functions 8 3 1 Predefined Arithmetic Functions The following predefined arithmetic functions are available E El and E2 stand for arbitrary arithmetic expressions 3This is in contrast to a floating point number which represents a real number which lies somewhere in the vicinity of the float 69 Function Description Argument Types Result Type E unary plus number number E unary minus number number abs E absolute value number number sgn E sign value number integer floor E round down to integral value number number round E round to nearest integral value number number El E2 addition number x number number El E2 subtraction number x number number El E2 mul
101. 50 float 2 69 floating point numbers 68 floundering 166 177 flush 1 89 209 for iterator construct 31 foreach iterator construct 30 foreacharg iterator construct 30 foreachelem iterator construct 30 foreachindex iterator construct 31 format string 92 free 1 50 160 freeze 2 183 fromto iterator construct 30 fullstop 13 functor 4 functor 3 35 51 189 G all ancestors debugger cmd 128 g ancestor debugger cmd 128 garbage collection 200 garbage_collect 0 201 get 1 87 get 1 2 87 get 2 87 get_event_handler 3 108 112 get_file_info 3 205 get_flag 2 11 16 17 44 45 138 203 204 207 229 get_flag 3 43 44 63 182 get_interrupt_handler 3 115 get_module_info 3 63 65 get_priority 1 180 get_stream 2 84 get_stream_info 3 87 90 get_suspension_data 3 177 get_var_bounds 3 159 get_bounds handler 159 get_event_handler 3 108 112 get_file_info 2 205 get_file_info 3 205 get_flag 2 204 207 getcwd 1 39 205 getenv 2 203 getval 2 78 81 global flag prefer_rationals 71 global flags 68 global reference 75 80 global stack 199 goal 4 goal expansion 47 grammar rules 102 ground 4 h help debugger cmd 128 halt 0 12 116 203 hash table 76 head 4 clause 4 pair 5 heap 198 help 15 help 0 12 help 1 12 205 history 15 hostid 204 hostname 204 i invocation skip debugger cmd 125 icompile 2 146 if then else
102. 6 number 1 50 number_string 2 39 numbervars 3 218 o output mode debugger cmd 121 138 object code 51 occur check 44 of 2 27 op 3 56 227 231 open 3 6 84 90 91 open 4 84 91 operator 227 operators 231 optimisation 143 os_file_name 2 206 output 83 output options 91 output_mode 160 overflow stack 242 p Show subterm path debugger cmd 135 pair 5 param iterator construct 31 pathname 4 206 pattern matching 162 168 pause 0 14 performance 143 phrase 3 103 104 pid global flag 207 pipe streams 86 plus 3 72 port_profiler library 150 portray 3 100 177 postfix 227 postponed 175 ppid global flag 207 pragma 48 pre_unify handler 159 pred 1 63 121 predicate 5 predicate name 247 PredSpec 5 prefer_rationals 68 71 prefix 227 prefix ambiguity 228 prefix infix ambiguity 228 pretty_print 2 147 pretty_printer library 143 print handler 159 print 2 93 printf 2 92 100 160 printf 2 3 209 printf 2 3 159 printf 3 91 92 priority 165 private heap 198 procedure built_in 3 dynamic 4 external 4 functor 5 regular 5 simple 5 static 6 tool 61 profile 1 148 258 profiling 143 147 program analysis 143 program clause 5 Prolog 165 prolog_suffix 17 properties module 63 predicate 63 put 1 87 put 1 2 87 put 2 87 q query the failure culprit debugger cmd 126 qualified acccess 59 qualified
103. 84 logical update semantics 97 lookup module 63 loop_name iterator construct 32 loops 29 m module debugger cmd 120 138 macro no_macro_expansion 53 101 write 160 macro expansion 99 macro 3 53 100 macro_expansion 101 macros clause 100 compiler 99 goal 100 protect_arg 100 read 99 100 term 100 top_only 100 type 100 write 99 100 mailing list 2 make 0 13 45 make_display_matrix 2 19 20 make_display_matrix 5 19 make_suspension 3 119 177 make_suspension 3 4 176 make_suspension 4 177 make_display_matrix 2 20 make_display_matrix 5 20 matching 39 162 168 matmult 3 36 matrix 35 MegaLog 1 member 2 248 memberchk 2 248 memory usage 197 merge_suspension_lists 4 178 meta predicates 61 meta 1 50 160 meta_attribute 2 155 metaterms 155 minimize 2 175 mode declaration 46 257 mode 1 46 module 1 46 52 56 63 module 3 63 217 modules 55 multifor iterator construct 31 n nodebug debugger cmd 125 N nodebug permanently debugger cmd 139 name conflict 58 Name Arity 3 5 named structure 248 nil 5 no_macro_expansion 1 28 53 101 nodbgcomp 0 16 123 219 nodebug 0 122 Non logical Variables 77 nonground 1 50 168 183 251 nonground 2 172 nonground 3 168 nonlogical variables 198 nonvar 1 50 nospy 1 121 122 not 1 50 not_unify 2 158 194 notify_constrained 1 173 notrace 0 122 null 83 number
104. A white yes enum 7 Afenum yellow blue white green red no more solution Some further remarks on this code The second clause of unify_term_enum 2 is a matching clause as indicated by the gt guard A matching clause is the only way to decompose an attributed variable Note that this clause matches only calls that have an attributed variable with nonempty enum attribute on the first argument position 16 10 Attribute Specification The structures notation see section 5 1 is used to define and access variable attributes and their arguments This makes the code independent of the number of attributes and positions of 162 their arguments Wherever appropriate the libraries described in this document describe their attributes in this way e g suspend inst I constrained C bound B says that the structure name is suspend and that it has at least three arguments with the corresponding names 163 164 Chapter 17 Advanced Control Features 17 1 Introduction This chapter introduces the control facilities that distinguish the ECL PS language from Prolog by providing a computation rule that is more flexible than simple left to right goal selection The core feature is the ability to suspend the execution of a goal at some point during execution and resume it under certain conditions at a later stage Together with attributed variables these facilities are the prerequisites for the impleme
105. At least one of List MinList and MaxList must be a list of fixed length at call time so that it is known how many indices are to be iterated multifor List MinList MaxList IncrementList same as before but IncrementList can be specified i e how much to increment each element of List by IncrementList must be either a list of arithmetic expressions evaluating to non zero integers or an arithmetic expression evaluating to a non zero integer in which case all elements are incremented by this amount IncrementList defaults to 1 count I Min Max iterate Goals with I ranging over integers from Min up to Max I is a local variable in Goals Can be used for controlling iteration as well as counting i e Max can be a variable param Varl Var2 for declaring variables in Goals global ie shared with the context CAUTION By default variables in Goals are local Note that fromto 4 is the most general specifier subsuming the functionality of all the others but foreach 2 foreacharg 2 3 foreachelem 2 3 foreachindex 2 count 3 for 3 4 multifor 3 4 and param N are convenient shorthands More than one iteration specifier can be given in one do loop and the order in which they are written does not matter In the case of several iteration specifiers typically not all of them will impose a termination condition on the loop e g foreach with an uninstantiated list or count with an uninstantiated maximum do not impose a termination conditio
106. CT integer gt 5left subterm INSPECT atom gt In the above example the current subterm was at the third argument thus trying to move left by 5 argument positions is not possible and the current subterm stopped at leftmost position the first argument nrightarrow key Move current subterm right by N positions nC Move current subterm right by N positions The rightarrow key or the equivalent C moves the current subterm to a sibling subterm i e fellow argument of the parent structure that is to the right of it Consider the structure foo a g b 1 21 3 then for the first argument a g b 1 21 isa right sibling with distance of 1 and 3 is a right sibling with distance of 2 The optional numeric argument for the command specifies the distance to the left that the current subterm should be moved It defaults to 1 foo a g b 1 21 3 INSPECT integer gt 2left subterm INSPECT atom gt 132 If the rightward movement specified would move the argument position beyond the last argument of the parent term then the movement will stop at the last argument foo a g b 1 21 3 INSPECT foo 3 gt 3 lt NL gt 3 INSPECT integer gt right subterm INSPECT integer gt In the above example the current subterm was at the third and last argument thus trying to move to the right by the default 1 position in this case is not possible and the current subterm remains at the third argument
107. CT list 1 head 2 tail 7 gt 6down subterm 2 for 6 levels 8 9 INSPECT list 1 head 2 tail gt In order to move down a list we repeatedly move into the tail of the list the second argument position In order to do this with the down arrow command we need to be at the second argument position first and this is done in the second trace line Once this is done then it is possible to move arbitrarily far down the list in one go as is shown in the example Print structure definition In ECL PSS it is possible to define field names for structures see section 5 1 If the inspector encounters such structures then the user can get the debugger to print out the field names Note that this functionality only applies within the inspect subterm mode as the debugger command normally prints the source for the predicate The fact that a structure has defined field names are indicated by a struct in the summary local struct capital city country 134 1 1 CALL f capital london C gt 1 lt NL gt capital london C INSPECT struct capital 2 gt structure definition 1 city 2 country i gt In this example a structure definition was made for captial 2 When this structure is the current subterm in the inspect mode the struct in the summary for the structure indicates that it has a structure definition For such structures the field names are printed by the structure definition command If the command is
108. Clause See program clause or goal Callable Term A callable term is either a compound term or an atom 3 Compound Term Compound terms are of the form f t i C2 sers tn where fis the functor of the compound term and ti are terms n is its arity Lists and Pairs are also compound terms DID Each atom created within ECL PS is assigned a unique identifier called the dictionary identifier or DID Difference List A difference list is a special kind of a list Instead of being ended by nil a difference list has an uninstantiated tail so that new elements can be appended to it in constant time A difference list is written as List Tail where List is the beginning of the list and Tail is its uninstantiated tail Programs that use difference lists are usually more efficient and always much less readable than programs without them Dynamic Procedures These are procedures which can be modified clause wise by adding or removing one clause at a time Note that this class of procedure is equivalent to interpreted procedures in other Prolog systems See also static procedures ElemSpec An ElemSpec specifies a global variable an atom or an array element a ground compound term with as much arguments integers as the number of dimensions of the array External Procedures These are procedures which are defined in a language other than Prolog and explicitly connected to Prolog predicates by the user Fact A fact or unit clause is a term of th
109. ECL PS User Manual Release 5 8 Abderrahamane Aggoun ECRC David Chan ECRC Pierre Dufresne ECRC Eamon Falvey ICL ITC Hugh Grant ICL ITC Warwick Harvey IC Parc Alexander Herold ECRC Geoffrey Macartney ECRC Micha Meier ECRC David Miller ICL ITC Shyam Mudambi ECRC Stefano Novello ECRC and IC Parc Bruno Perez ECRC Emmanuel van Rossum ECRC Joachim Schimpf ECRC and IC Parc Kish Shen IC Parc Periklis Andreas Tsahageas ECRC Dominique Henry de Villeneuve ECRC April 14 2005 Trademarks UNIX is a trademark of AT amp T Bell Laboratories Quintus and Quintus Prolog are trademarks of Quintus Computer Systems Incorporated VAX is a trademark of Digital Equipment Corporation SUN 3 and SUN 4 are trademarks of Sun Microsystems Inc International Computers Limited and ECRC GmbH 1992 1995 International Computers Limited and Imperial College London 1996 2000 Contents 1 Introduction 1 Lt Wiis CIM E O CaS SL 1 V2 Overview it a a ea e Gon Aue aU ee ea AE Ge 1 1 3 Further Information y sven 2s 244 pe da BE ee ee he a 2 1 4 Reporting Problems 0 0 0 ee ee 2 2 Terminology 3 3 Getting started with ECL PS 7 3 1 How do I install the ECL PS system 2 0 0 oo 7 3 2 How do I run my ECLPS programs 4 0 4 4 4 nd Be dae pide 7 3 3 How dol use tkeclipse 000000 2 eee ee 7 3 3 1 Getting started ee 7 3 4 How do I write an POL PS program ate 40 s dt a le Ra
110. Library Manual describes the major ECL PS libraries in particular the ones implementing constraint solvers The Interfacing and Embedding Manual describes how to interface ECL PS to other pro gramming languages and in particular how to embed it into an application as a component The Reference Manual contains detailed descriptions of all the Built in predicates and the li braries This information is also available from the development system s help 1 command and the tkeclipse library browser The Visualisation Manual describes the facilities for the visualisation of constraint propa gation and search All the documentation can be accessed using an html browser refer to the eclipse installation directory under doc index html 1 3 Further Information ECL PS has initially been developed at the European Computer Industry Research Centre ECRC in Munich and is now being further developed and maintained at IC Parc Centre for Planning and Resource Control at the Imperial College in London with the support of ICL and the CHIC 2 ESPRIT project Up to date information including ordering information can be obtained from the ECL PS web site http www icparc ic ac uk eclipse or by sending email to eclipse request icparc ic ac uk There is also an ECL PS user group mailing list Contributions to this list can be sent to eclipse users icparc ic ac uk and requests for being added to or removed from this list to majordomo icparc ic a
111. Micha Meier Philip Kay Emmanual van Rossum and Hugh Grant Sepia programming environment In Proceedings of the NACLP 89 Workshop on Logic Programming Environ ments The Next Generation pages 82 86 Cleveland October 1989 Micha Meier and Joachim Schimpf An architecture for prolog extensions In Proceedings of the 3rd International Workshop on Extensions of Logic Programming pages 319 338 Bologna 1992 Micha Meier Joachim Schimpf and Emmanual van Rossum A guide to SEPIA customiza tion and advanced programming Technical Report TR LP 50 ECRC June 1990 Stefano Novello and Joachim Schimpf ECLiPSe Embedding and Interfacing Manual 1999 John K Ousterhout Tcl and the Tk Toolkit Addison Wesley 1994 D Warren An Abstract Prolog Instruction Set Technical Note 309 SRI October 1983 263
112. N attr_var attributes term_h term_g goals goals goals goals goals gt goals goals gt goals body term_h 0 term 1200 term_g 0 term 1200 VAR not a term_h attr_var not a term_h ATOM structure structure_with_fields subscript list STRING number not a term_h nor a term_g not a term_h nor a term_g bterm term 0 prefix_expression N infix_expression N postfix_expression N fx N term N 1 fy N term N fxx N term N 1 term N 1 fxy N term N 1 term N term N 1 xfx N term N 1 term N yfx N term N 1 term N 1 xfy N term N term N 1 xf N term N yf N VAR attributes Note no space before attribute attribute attributes 225 attribute qualified_attribute nonqualified_attribute structure structure_with_fields subscript termlist list listexpr term_a number bterm functor rulech qualified_attribute nonqualified_attribute ATOM nonqualified_attribute term_a functor termlist Note no space before functor termlist Note no space before structure list VAR list Note no space before list term_a term_a termlist listexpr term_a term_a term_a term_a term_a term_a listexpr term 1200 Note it depends on syntax_options INT INTBAS INTCHAR RAT FLOAT BREAL clause clause ATOM arity gt 0 226 A 3 1
113. N to switch tracing off permanently 125 query the failure culprit The purpose of this command is to find out why a goal has failed FAIL or was aborted with an exit_block LEAVE It prints the invocation number of the goal which caused the failure You can then re run the program in creep mode and type q at the first command prompt This will then offer you to jump to the CALL port of the culprit goal eclipse 3 p 1 1 CALL p gt skip 1 1 FAIL p gt query culprit failure culprit was 3 rerun and type q to jump there gt nodebug No 0 00s cpu eclipse 4 p 1 1 CALL p gt query culprit failure culprit was 3 jump to invoc 3 3 3 CALL r 1 gt creep 3 3 FAIL r gt creep 2 2 FAIL q gt creep 1 1 FAIL p gt creep No 0 01s cpu var term modification skip This command sets up a monitor on the currently displayed term which will cause a MODIFY port to be raised on each modification to any variable in the term These ports will all have a unique invocation number which is assigned and printed at the time the command is issued This number can then be used with the i command to skip to where the modifications happen eclipse 4 X Y 1 9 X gt Y Y gt 1 1 1 CALL X Y 1 9 gt var term spy y Var term spy set up with invocation number 2 gt jump to invoc 1 2 3 MODIFY X 1 9 Y 2 9 1 9 gt jump to invoc 2 2 4 MODIFY X 2 9 Y 2
114. PS is not exited This is a way to prevent accidental exits from the system Failure of the handler is ignored C 1 8 Macro Transformation Errors Lexical Analyser Event Event Type Default Event Handler 160 global macro transformation already exists error_handler 3 161 macro transformation already defined in this macro _handler 3 module 162 no macro transformation defined in this module warning_handler 2 163 illegal attempt to remove the last member of a error_handler 2 character class 164 toplevel print banner tty_banner 2 165 can t compile an attributed variable use error_handler 2 add_attribute 2 3 166 file successfully processed record_compiled_file_handler 3 The event 164 is raised whenever the toplevel loop is restarted Event Second Argument Third Argument 164 the banner string 239 C 1 9 I O Operating System External Interface Event Event Type Default Event Handler 170 system interface error system_error_handler 4 171 File does not exist error_handler 2 172 File is not open error_handler 2 173 library not found error_handler 2 174 child process terminated due to signal error_handler 2 175 child process stopped error_handler 2 176 message passing error error_handler 2 177 shared library not found error_handler 2 190 end of file reached eof handler 4 191 output error output_error_handler 4 192 illegal stream mode error_handler 2 193 illegal stream sp
115. _priority p X p Y p Z 2 term f X Y Z term f 1 1 1 17 10 2 Choice of Priorities Although the programmer is more or less free to specify which priorities to use we strongly recommend to stick to the following scheme from urgent to less urgent debugging 1 goals which don t contribute to the semantics of the program and always suc ceed e g display routines consistency checks or data breakpoints immediate goals which should be woken immediately and which do not do any bindings or other updates Examples are quick tests which can immediately fail and thus avoid redundant execution quick fast deterministic goals which may propagate changes to other variables normal deterministic goals which should be woken after the quick class slow deterministic goals which require a lot of processing e g complicated disjunctive con straints delayed nondeterministic goals or goals which are extremely slow toplevel goal 12 the default priority of the user program 17 11 Details of the Execution Mechanism 17 11 1 Particularities of Waking by Unification Goals that are suspended on the inst or bound waking conditions are woken by unifications of their suspending variables One suspending variable can be responsible for delaying several goals on the other hand one goal can be suspended on several suspending variables as alternative waking conditions This means that when one suspending variable is bound several dela
116. _variables Term VarList wait_for_var VarList Goal wait_for_var Goal call Goal wait_for_var X L Goal 186 var X gt suspend wait_for_var X L Goal 3 X gt inst nonground X gt term_variables X Vars append Vars L NewVars wait_for_var NewVars Goal wait_for_var L Goal 18 2 Waiting for Binding Sometimes we want a goal to be woken when a variable is bound to another one e g to check for subsumption or disequality As an example let us construct the code for the built in predicate 2 This predicate imposes the disequality constraint on its two arguments It works as follows 1 It scans the two terms If they are identical it fails 2 If it finds a pair of different arguments at least one of which is a variable it suspends If both arguments are variables the suspension is placed on the bound suspended list of both variables If only one is a variable the suspension is placed on its inst list because in this case the constraint may be falsified only if the variable is instantiated 3 Otherwise if it finds a pair of arguments that cannot be unified it succeeds 4 Otherwise it means that the two terms are equal and it fails The code looks as follows equal_args 3 scans the two arguments If it finds a pair of uni fyable terms it returns them in its third argument Otherwise it calls equal_terms 3 which decomposes the two terms and scans recursively all their arguments
117. a procedure with a reserved name error_handler 2 234 C 1 4 Modules Visibility Event Event Type Default Event Handler 80 not a module error_handler 2 81 module 1 can appear only as a directive error_handler 2 82 trying to access a locked module locked_access_handler 2 83 creating a new module warning handler 2 84 referring to non exported predicate declaration_warning_handler 3 85 referring to non existing module declaration_warning_handler 3 86 lookup module does not exist no_lookup_module_handler 4 87 attempt to redefine an existing local item warning_handler 3 88 attempt to redefine an existing exported item warning_handler 3 89 attempt to redefine an already imported item warning handler 3 90 procedure is already reexported error_handler 3 91 not a tool procedure error_handler 2 92 trying to redefine an existing local procedure error_handler 3 93 trying to redefine an existing exported proce error_handler 3 dure 94 trying to redefine an existing imported proce error_handler 3 dure 96 ambiguous import ambiguous_import_resolve 3 97 module already exists error_handler 2 98 key not correct error_handler 2 99 unresolved ambiguous import ambiguous_import_warn 3 100 accessing a procedure defined in another module undef dynamic_handler 3 101 trying to erase a module from itself error_handler 2 235 C 1 5 Syntax Errors Parsing Event Event Ty
118. a syntax option settings this is done for example by the compatibility packages In addition to the above extensions the following minor differences exist between default ECL PS syntax and most Prolog systems e In ECL PS end of file is accepted as fullstop 1 Quotes on the other hand are used to build atoms from characters with different or mixed character classes they do not change the precedence of operators 228 e By default an unquoted vertical bar can be used as an atom or functor controlled by the syntax option bar_is_no_atom e By default operators with precedence higher than 1000 are allowed in a comma separated list of terms i e structure arguments and lists The ambiguity is resolved by considering commas as argument separators rather than operators inside the term Thus e g pla b c is accepted and parsed as p 2 This behaviour can be disabled and turned into a syntax error by setting the syntax option limit_arg_ precedence e By default double quoted items are parsed as strings not as character lists This behaviour can be changed via set_chtab 2 which allows string quotes list quotes and atom quotes to be redefined e By default consecutive string or list quotes have the effect of concatenating the quoted items while consecutive atom quotes have no special meaning The syntax option dou bled_quote_is_quote changes this e By default blank space between a sign and a number is significant Whe
119. acktracking is required otherwise use memberchk 2 to avoid hidden choice points The final code may not contain dead code except in the file module unsupported ecl This file should contain all program pieces which are kept for information debugging but which are not part of the deliverable The test set s should exercise 100 percent of the final code Conformity is checked with the line coverage profiler Explicit unification 2 should be replaced with unification inside terms where possible There is a top level file top ecl which can be used to generated all on line documentation automatically For each module a module diagram is provided For the top level files component diagrams are provided Don t use 2 to make tuples 248 36 37 Don t use lists to make tuples Avoid append 3 where possible use accumulators instead E 2 Module structure The general form of a module is 1 module definition module comment or inclusion of a spec file exported reexported predicates used modules used libraries local variable definitions other global operations and settings predicate definitions E 3 Predicate definition The general form of a predicate definition is 1 2 3 predicate comment directive mode declaration predicate body 249 250 Appendix F Restrictions and Limits The ECL PS implementation tries to impose as few limits as possible The exist
120. acter Lys sa al 87 10 2 2 Token On a LE as a eek Ge ek iia e ee eee 87 10 2 3 Term T O ct oe Oe A dan ot ce a Roth a a E hs 88 10 2 4 General Parsing and Text Generation o 89 10 20 Flushing i ira e eo Poe BAe Pe SE Dads G 89 10 2 6 Prompting Vb asi a Bree LN Ge Oe mare ke S 89 10 27 Position ng s sorag hd ke eh ae eh RR A a POR ee el eee a a 89 10 3 In memory Streams oaoa ee 90 10 3 1 String Streams sca a eed ea Ble Pe Ge Soe i SG 90 10 3 2 Queue streams danii dass bee Re ee ada A eee a 91 10 4 Term Outpiit Formats 2 cae bE Lise ob pw Be Se A EO oe e 91 10 4 1 Write_term and Printf 0 0 0202000020000 087 91 10 4 2 Other Term Output Predicates 0 0 0 02000 93 10 4 3 Default Output Options 0 020200 00 2 eee 93 11 Dynamic Code 95 11 1 Compiling Procedures as Dynamic or Static 2 0 2 2 ee ee 95 11 2 Altering programs at run time 2 00000 eee ee eee 97 12 ECL PS Macros 99 12 11 Introduction rate a A a ad les 99 12 2 Using the macros ma aa a e o E ea a a A 99 12 3 Definite Clause Grammars DOGS e 102 12 3 1 Simple DCG example e 103 12 3 2 Mapping to Prolog Clauses e e 104 12 3 3 Parsing other Data Structures o 105 13 Events and Interrupts 107 toL A E NA 107 13 1 1 Event Identifiers and Event Handling 107 13 1 2 Raising Events sae A A
121. ammar_body grammar_body gt grammar_body gt gt grammar_body grammar_body gt grammar_body grammar_body grammar_body iteration_spec do grammar_body gt grammar_body grammar_body grammar_body grammar_body_item grammar_body_item gt grammar_body_item gt Prolog_goals grammar_body_item gt non_terminal grammar_body_item gt terminal 2So that the user can redefine it with a local one 102 The non terminals are syntactically identical to prolog goals atom compound term or variable the terminals are lists of prolog terms typically characters or tokens Every term is transformed unless it is enclosed in curly brackets The control constructs like conjunction 2 disjunction 2 or 2 the cut 0 the condition gt 1 and do loops do not need to be enclosed in curly brackets The grammar can be accessed with the built in phrase 3 The first argument of phrase 3 is the name of the grammar to be used the second argument one is a list containing the input to be parsed If the parsing is successful the built in will succeed For instance with the grammar a gt z a phrase a X will give on backtracking X z X z z X z z z 12 3 1 Simple DCG example The following example illustrates a simple grammar declared using the DCGs sentence gt imperative noun_phrase Number
122. an attributed variable can be accessed using one way unification in a matching clause e g get_attribute X Name Attribute A o A Attribute This clause succeeds only when the first argument is an attributed variable and it binds X to the whole attributed variable and A to the attribute with name Name Note that a normal unification clause can not be used to decompose an attributed variable it would create a new attributed variable and unify this with the caller argument but the unification is handled by an attributed variable handler see Section 16 7 156 16 6 Attribute Modification Often an extension needs to modify the data stored in the attribute to reflect changes in the computation The usual Prolog way to do this is by reserving one argument in the attribute structure for this next value before accessing the most recent attribute value this chain of values has to be dereferenced until a value is found whose link is still free A perfect compiler should be able to detect that the older attribute values are no longer accessed and it would compile these modifications using destructive assignment Current compilers are unfortunately not able to perform this optimization some systems can reduce these chains during garbage collection but until this occurs the list has to be dereferenced for each access and update To avoid performance loss for both attribute updating and access ECL PS provides a predicate for explicit attrib
123. and letter e g c creep The number is just prefixed to the command and terminated by the command letter itself If a counter is given for a command that doesn t accept a counter it is ignored 1 provided the call has been compiled in debug_compile mode or the call is a meta call 124 When a counter is used and is valid for the command the command is repeated decrementing the counter until zero When repeating the command the command and the remaining counter value is printed after the debugger prompt instead of waiting for user input Some commands prompt for a parameter e g the j jump command asks for the number of the level to which to jump Usually the parameter has a sensible default value which is printed in square backets If just a newline is typed then the default value is taken If a valid parameter value is typed followed by newline this value is taken If an illegal letter is typed the command is aborted 14 6 2 Commands to Continue Execution All commands in this section continue program execution They difference between them is the condition under which execution will stop the next time When execution stops again the next trace line is printed and a new command is accepted nc creep This command allows exhaustive tracing the execution stops at the next port of any leashed procedure No further parameters are required a counter n will repeat the com mand n times It always applies on the current procedure
124. andler is invoked when terms are copied by the copy_term 2 or copy_term_vars 3 built ins The handler procedure is copy_handler AttrVar Copy Attr Var is the attributed variable encountered in the copied term Copy is its corresponding variable in the copy All extension handlers receive the same arguments This means that if the attributed variable should be copied as an attributed variable the handler must check if Copy is still a free variable or if it was already bound to an attributed variable by a previous handler suspensions this handler is invoked by the suspensions 2 predicate to collect all the suspension lists inside the attribute The handler call pattern is suspensions_handler AttrVar ListOfSuspLists Tail Attr Var is an attributed variable The handler should bind ListOfSuspLists to a list con taining all the attribute s suspension lists and ending with Tail 158 e delayed goals number handler is invoked by the delayed_goals_number 2 predicate The handler call pattern is delayed_goals_number_handler AttrVar Number AttrVar is the attributed variable encountered in the term Number is the number of delayed goals occurring in this attribute Its main purpose is for the first fail selection predicates i e it should return the number of constraints imposed on the variable e get_bounds This handler is used by the predicate get_var_bounds 3 to retrieve in formation about the lower and upper bound of a nu
125. ard I O descriptors of the process In an embedded ECL PS the meaning of stdin stdout and stderr is determined by the ECL PS initialisation options Moreover every ECL PS session defines the following symbolic stream names which are used for certain categories of input output input Used by the input predicates that do not have an explicit stream argument e g read 1 This is by default the same as stdin but can be redirected output Used by the output predicates that do not have an explicit stream argument e g write 1 This is by default the same as stdout but can be redirected error Output for error messages and all messages about exceptional states This is by default the same as stderr but can be redirected warning output Used by the system to output warning messages This is by default the same as stdout but can be redirected 83 log output Used by the system to output log messages e g messages about garbage collection activity This is by default the same as stdout but can be redirected user This identifier is provided for compatibility with Prolog systems and it is identical with stdin and stdout depending on the context where it is used Symbolic Stream System Stream input 0 stdin output 1 stdout warning output 1 stdout log_output 1 stdout 2 stderr 3 null Initial assignment of symbolic stream names error 10 1 2 Stream Identifiers and Aliases
126. ariable a constant i e an atom a number or a string or a compound term The notation Pred N1 N2 is often used in this documentation as a shorthand for Pred N1 Pred N 2 Chapter 3 Getting started with ECL PS 3 1 How do I install the ECL PS system Please see the installation notes that came with ECL PS For Unix Linux systems these are in the file README_UNIX For Windows they are in the file README_WIN TXT Please note that choices made at installation time can affect which options are available in the installed system 3 2 How do I run my ECL PS programs There are two ways of running ECL PS programs The first is using tkeclipse which provides an interactive graphical user interface to the ECL PS compiler and system The second is using eclipse which provides a more traditional command line interface We recommend you use TkECL PS unless you have some reason to prefer a command line interface 3 3 How do I use tkeclipse 3 3 1 Getting started To start TkECL PS either type the command tkeclipse at an operating system command line prompt or select TkECL PS from the program menu on Windows This will bring up the TkECL PS top level which is shown in Figure 3 1 Note that help on TkECL PS and its component tools is available from the Help menu in the top level window If you need more information than can be found in this manual try looking in the Help menu 3 4 How do I write an ECL PS program You
127. ary to detect failure the two terms can become equal only if this variable is bound to a matching term This approach has one disadvantage though We always wake the dif 2 call with the original terms as arguments Each time the suspension is woken we scan the two terms from the beginning and thus repeat the same operations If for instance the compared terms are lists with thousands of elements and the first 10000 elements are ground we spend most of our time checking them again and again The reason for this handling is that the system cannot suspend the execution of dif 2 while executing its subgoals it cannot freeze the state of all the active subgoals and their arguments There is however a possibility for us to do this explicitly as soon as we find a variable we stop scanning the terms and return a list of continuations for all ancestor compound arguments In this way equal_args returns a list of pairs and their continuations which will then be processed step by step e equal args 4 scans again the input arguments If it finds a pair of unifyable terms it inserts it into a difference list e equal lists 4 processes the arguments of compound terms As soon as a variable is found it stops looking at following arguments but it appends them into the difference list e diff_pairs 2 processes this list If it finds an identical pair it succeeds the two terms are different Otherwise it suspends itself on the variables in the matched
128. ases the flag coroutine has now no influence on the execution speed Some programs spend a lot of time in the garbage collection collecting the stacks and or the dictionary If the space is known to be deallocated anyway e g on failure the programs can be often speeded up considerably by switching the garbage collector off or by increasing the gc_interval flag As the global stack expands automatically this does not cause any stack overflow but it may of course exhaust the machine memory When the program is running and its speed is still not satisfactory use the profiling tools The profiler can tell you which predicates are the most expensive ones and the statistics tool tells you why A program may spend its time in a predicate because the predicate itself is very time consuming or because it was frequently executed The statistics tool gives you this information It can also tell whether the predicate was slow because it has created a choice point or because there was too much backtracking due to bad indexing One of the very important points is the selection of the clause that matches the current call If there is only one clause that can potentially match the compiler is expected to recognise this and generate code that will directly execute the right clause instead of trying several subsequent clauses until the matching one is found Unlike most of the current Prolog compilers the ECL PS compiler tries to base this selection indexing o
129. ason Waking on Constraining constrained In plain Prolog variable instantiation is the only way in which a single variable can become more constrained In the presence of constraints there are other ways The most obvious example are variable domains when a variable s domain gets reduced the variable becomes more constrained This means that a delayed goal that previously still had a chance to succeed could now have become impossible to satisfy and should therefore be checked again The purpose of the constrained waking condition is to make it possible to wake a suspended goal whenever a variable becomes more constrained in a general sense Having this general notion of constrained ness makes it possible to write generic libraries that do interesting things with constraints and constrained variables without their implementation having to be linked to a particular constraint solver The constrained waking condition subsumes the bound condition which in turn subsumes the inst condition While goals suspended on the inst and bound conditions are woken implicitly by the unification routine libaries which implement domain variables are responsible for notifying the system when they constrain a variable They do so by invoking the built ins notify_constrained 1 and wake 0 which is the generic way of telling the system that a variable has been constrained The simplest application using the constrained condition is a little debugging support pr
130. ation it will often be necessary to use brackets e g in ria X gt Y The 2 primitive can be used to resolve import conflicts i e the case where the same name is exported from more than one module and both are needed In this case none of the conflicting predicates is imported an attempt to call the unqualified predicate raises an error The solution is to qualify every reference with the module name lib ria exports gt 2 lib eplex exports gt 2 ria X gt Y eplex X gt Y Another case is the situation that a module wants to define a predicate of a given name but at the same time use a predicate of the same name from another module It is not possible to import the predicate because of the name conflict with the local definition Explicit qualification must be used instead lib lists print_list List writeln This is the list lists print_list List A more unusual feature which is however very appropriate for constraint programming is the possibility to call several versions of the same predicate by specifying several lookup modules ria eplex X gt Y which has exactly the same meaning as ria X gt Y eplex X gt Y Note that the modules do not have to be known at compile time i e it is allowed to write code like after X Y Solver Solver X gt Y However this is likely to be less efficient because it prevents compi
131. ation 8 4 gsr 26 4 8 jad ie a es eb dd Soe 221 As2 1 Character Classes ori ms tans Sexe dbs ah eee eel Oe we Be ae ek Oe 221 A 2 2 Groups of Characters 222 A 2 3 Valid Tokens le ac dol Sk ae a are ego a eed eS Be Bm 222 A 2 4 Escape Sequences within Strings and Atoms 224 A 3 Formal definition of clause syntax aooaa aa ee 224 AlL Comments a Ga ee i ne ke eee ele A Ga ai 227 ALB 2S Operators ie sea ses oh sete A oP ee aL A a 227 A 3 3 Operator Ambiguities e 228 A 4 Syntax Differences between ECL PS and other Prologs 228 vil A 5 Changing the Parser behaviour 0 0 0 0002 eee ee nee 229 A 6 Short and Canonical Syntax oaa ee 230 Operators 231 C Events 233 Cul Eyent Py pes senso ions oe te heath Bae Sade GRAS TR BM aS ok at GS 233 C 1 1 Argument Types and Values 0 0 00002 eee eee 233 C 1 2 Arithmetic Environment 20 0000 ee ee ee 234 C 1 3 Data and Memory Areas Predicates Operators 234 C 1 4 Modules Vistbility lt sre gd 8h ek yee Ee E eG 235 C26 Syntax Errors Parsing cu 2 0 oo Ach ee le E ea ia 236 C 1 6 Compilation Run Time System Execution 237 Gili Top L vel ea a ha ee OE a Deedee ae el aa 238 C 1 8 Macro Transformation Errors Lexical Analyser 239 C 1 9 I O Operating System External Interface 240 C 1 10 Debugging Object Files 2 2 2 20 20 0000 202000208
132. ation Goal and are executed whenever the module containing the declaration gets imported into an other module The call will happen in the context of the importing module Finalization Goals these are specified as local finalization Goal and are executed just before the module containing them gets erased Modules can get erased either explicitly through erase_module 1 or implicitly when the module is re compiled or when the ECL PS session is exited Finalization goals should not do any I O because in the case of an embedded ECLiPSe I O may no longer be available at finalization time 7 4 4 Locking Modules By default ECL PS does not strictly enforce the hiding of module internals This facilitates program development as is makes it possible to inspect and trace without being too concerned about module boundaries E g you can set a spy point on a local predicate p 3 in module othermod by calling spy p 3 othermod 4to the extent implemented by ECL PS s compatibility library 64 Once a module implementation is stable and there is a need for privacy it is possible to lock a module Locking makes it impossible to access internal local items from outside the module Of course the module can still be used though its interface The built in predicates related to locking are lock 1 which provides a definitive lock lock 2 which allows subsequent unlocking using a password unlock 2 and get_module_info 3 which allo
133. ax_option 229 system 1 206 tail 5 term 6 term _hash 4 251 term_string 2 39 term_variables 2 186 251 test_unify handler 158 throw 1 115 timed events 109 timers 109 times 3 72 token 87 token class 88 tool system 62 tool 2 62 tool_body 3 63 Tools 61 tools 0 24 top level loop 12 167 toplevel module 56 trace 0 121 trace 1 121 123 trace_call_port 3 139 trace_exit_port 0 139 trace_parent_port 1 139 trace_point_port 3 139 260 traceable 1 121 trail stack 200 trigger 175 179 trigger 1 110 175 trimcore 0 198 true 0 96 113 115 157 182 twice 1 61 tyi 1 87 tyi 1 2 87 tyi 2 87 tyo 1 87 tyo 1 2 87 tyo 2 87 type breal 68 float 68 integer 68 rational 68 type macros 100 type_of 2 177 u scheduled goals debugger cmd 127 unification pattern matching 162 unify handler 157 unlock 2 65 unskipped 1 121 untraceable 1 121 uparrow key Move current subterm up by N levels debugger cmd 130 update mode 83 update_struct 4 28 use_module 1 16 52 57 101 user 84 user group 2 v var term modification skip debugger cmd 126 var 1 40 50 155 168 183 variable name 247 variable names 44 variable output 89 variable 1 78 variable_names 89 variables 13 variant 2 158 visible 58 59 wait 2 207 wake 0 173 179 waking 179 181 waking 1 123 warning_output 83 when declarations 184 windows 148 with 2 27 write macro
134. brary_path using the get_flag 2 and set_flag 2 predicates This flag contains a list of strings containing the pathnames of the directories to be searched when loading a library file User libraries may be be added to the system simply by copying the desired file into the ECL PS library directory Alternatively the library_path flag may be updated to point at a number of user specific directories The following example illustrates how a directive may be added to a file to add a user defined library in front of any existing system libraries get_flag library_path Path set_flag library_path home myuser mylibs Path The UNIX environment variable ECLIPSELIBRARYPATH may also be used to specify the initial setting of the library path The syntax is similar to the syntax of the UNIX PATH variable i e a list of directory names separated by colons The directories will be prepended to the standard library path in the given order 3 8 How do I make my programs run faster By default ECL PS compiles programs as traceable which means that they can be traced using the built in debugger To obtain maximum efficiency the directive nodbgcomp 0 should be used which will set some flags to produce a more efficient and shorter code eclipse 2 nodbgcomp yes eclipse 3 user father abraham isaac father isaac jacob father jacob joseph ancestor X Y father X Y ancestor X Y ancestor X Z ancestor Z Y
135. bug Debugger switched on leap mode 140 eclipse 2 repeat fail C interruption type a b c d e or h for help d 1 1 EXIT repeat gt 141 142 Chapter 15 Development Support Tools This chapter describes some of the tools and libraries provided by ECL PS that assist in program development and the analysis of program runtime behaviour 15 1 Available Tools and Libraries ECL PS provides a number of different tools and libraries to assist the programmer with pro gram development Document Tools for generating documentation from ECLiPSe sources Lint Generates warning messages for dubious programming constructs and violation of naming conventions for an ECLiPSe source module or file Pretty_printer Tools for pretty printing a file in different formats Xref Enables the analysis of an ECLiPSe source module or file for the construction of a predicate call graph In addition ECL PS provides several tools that aid in the understanding of a programs runtime behaviour Coverage Records the frequency at which various parts of the program are executed Debugger Provides a low level view of program activity Chapter 14 presents a comprehensive look at debugging of ECL PS programs Display matrix Shows the values of given terms in a graphical window Chapter 4 discusses the use of this tool Mode Analyser Collects statistics about the invocation modes of predicates within a running program in order to as
136. bugging purposes Use set_flag macro_expansion off to do so The next example shows the use of a type macro Suppose we want to represent integers as s 1 terms eclipse 1 user tr_int 0 0 tr_int N s S N gt 0 N1 is N 1 tr_int N1 S local macro type integer tr_int 2 yes eclipse 2 read X 101 3 is yes s s s 0 When we want to convert the s 1 terms back to normal integers so that they are printed in the familiar form we can use a write macro Note that we first erase the read macro for integers otherwise we would get unexpected effects since all integers occurring in the definition of tr_s 2 would turn into s 1 structures leclipse 3 erase_macro type integer yes eclipse 4 user tr_s 0 0 tr_s s S N tr_s S N1 N is N1 1 local macro s 1 tr_s 2 write yes eclipse 2 write s s s 0 3 yes 123 Definite Clause Grammars DCGs Grammar rules are described in many standard Prolog texts 2 In ECL PS they are provided by a predefined global macro for gt 2 When the parser reads a clause whose main functor is gt 2 it transforms it according to the standard rules The syntax for DCGs is as follows grammar_rule gt grammar_head gt grammar_body non_terminal non_terminal grammar_head gt grammar_head gt terminal grammar_body grammar_body grammar_body grammar_body grammar_body gr
137. c its clauses compiled from Somefile are added to the database just as would happen if they were asserted and the existing clauses are not affected For example if the following clauses have already been compiled 95 dynamic city 1 city london city paris and the file Somefile contains the following Prolog code city munich city tokyo then compiling Somefile will cause adding the clauses for city 1 to those already compiled as city 1 has been declared dynamic Thus the query city X will give eclipse 5 city X X london More X paris More X munich More X tokyo yes If however the compiled procedure is static the new clauses in Somefile replace the old procedure Thus if the following clauses have been compiled city london city paris and the file Somefile contains the following Prolog code city munich city tokyo when Somefile is compiled then the procedure city 1 is redefined Thus the query city X will give eclipse 5 city X X munich More X tokyo yes When the dynamic 1 declaration is used on a procedure that is already dynamic which may happen for instance by recompiling a file with this declaration inside the system raises the error 64 procedure already dynamic The default handler for this error however will only erase all existing clauses for the specified procedure so that when such a file is recompiled several tim
138. c uk 1 4 Reporting Problems In order to make ECL PS as useful and reliable as possible we would like to encourage users to submit problem reports via the web site http www icparc ic ac uk eclipse bugs html or by e mail to eclipse bugs icparc ic ac uk Chapter 2 Terminology This chapter defines the terminology which is used throughout the manual and in related doc umentation X This denotes an input argument Such an argument must be instantiated before a built in is called X This denotes an output argument Such an argument must be not instantiated before a built in is called X This denotes an input or an output argument Such an argument may be either instantiated or not when a built in is called Arity Arity is the number of arguments to a term Atoms are considered as functors with zero arity The notation Name Arity is used to specify a functor of name Name with arity Arity Atom An arbitrary name chosen by the user to represent objects from the problem domain A Prolog atom corresponds to an identifier in other languages Atomic An atom string or a number A terms which does not contain other terms Body A clause body can either be of the form Goal_1 Goal_2 Goal_k or simply Goal Each Goal_i must be a callable term Built in Procedures These are predicates provided for the user by the ECL PS system they are either written in Prolog or in the implementation language usually C
139. call hello main The call Goal Module construct means that the call is supposed to happen in the context of module main The debugger trace shows what happens main 5 top 1 1 CALL top 2 2 CALL twice hello 3 3 CALL twice hello main 4 4 CALL call hello main 5 5 CALL call hello 6 6 CALL hello S 7 7 CALL writeln hi hi S 7 7 EXIT writeln hi 6 6 EXIT hello One complication that can arise when you use tools is that the compiler must know that a predicate is a tool in order to properly compile a call to the tool If the call occurs textually before the tool declaration this will therefore give rise to an inconsistent tool redefinition error The tool 2 declaration must therefore occur before any call to the tool System Tools Many of the system built in predicates are in fact tools e g read 1 write 1 record 2 compile 1 etc All predicates which handle modular items must be tools so that they know from which module they have been called In case that the built in predicate has to be executed in a different module this is very often the case inside user tool predicates the 2 construct must be used e g current_predicate P SomeModule 62 7 3 6 Lookup Module vs Caller Module The following table summarises the different call patterns with and without module specifica tions There are only two basic rules to remember e 2 specifies the lookup module to find the definition e
140. can not be done when the clause exits nondeterministically this can be checked with the debugger or the profiling facility However if a deallocation has been delayed due to nondeterminism it is finally done when a cut is executed or when execution fails beyond the allocation point Hence the ways to limit growth of the local stack are e use tail recursion where possible e avoid unnecessary nondeterminism cf 19 1 3 19 1 3 The Control Stack The main use of the Control Stack is to store so called choicepoints A choicepoint is a description of the system s state at a certain point in execution It is created when more than one clause of a predicate apply to a given goal Should the first clause fail the system will backtrack to the place where the choice was made the old state will be restored from the choicepoint and the next clause will be tried Disjunctions 2 also create choicepoints The only way to reduce Control Stack usage is to avoid unnecessary nondeterminism This is done by writing deterministic predicates in such a way that they can be recognised by the system The debugger can help to identify nondeterministic predicates When it displays an EXIT port instead of EXIT then the predicate has left a choicepoint behind In this case it should be checked whether the nondeterminism was intended If not the predicate can often be made deterministic by e writing the clause heads such that a matching clause can be more easily s
141. cell the current value is shown because the space available in the cell may be too small to fully display the term and allows the user to inspect the term using the inspector Note that the display matrix can be used independently of or in conjunction with the tracer Multiple display matrices can be created to view different terms The following predicates are available in conjunction with the display matrix make_display_matrix Terms Name make_display_matrix Terms Prio Type CondList Name These predicates create a display matrix of terms that can be monitored under TkECL PSS The two argument form is a simplification of the five argument form with defaults settings for the extra arguments Terms is a list or array of terms to be displayed A List can be specified in the form List N where N is the number of elements per row of the matrix If N is 0 then 20 the list will be displayed in one row it could also be omitted in this case The extra arguments are used to control how the display is updated The terms are monitored by placing a demon suspension on the variables in each term When a demon wakes the new value of the term it is associated with is sent to the display matrix and possibly updated depending on the interactive settings on the matrix When the new value is backtracked the old value is sent to the display matrix The other arguments in this predicate is used to control when the demon wakes and what sort
142. changed and the labelling strategy cannot be changed 2Unless it is attached to the remote development tools in which case the display matrix is invoked 19 1 e al 1 _328 1 4 _S41 fl 4 _SS4 fl 4 _567 1 4 Continue stop none stop all 3 Update on ground Kill display Figure 4 1 Display Matrix Tool for 4 Queens Initial 1 2 3 Aaj 1 5MB 55412 4 Continue stop none stop all la Update on ground Kill display Figure 4 2 Display Matrix Tool for 4 Queens During execution length List N List 2 47 taN make_display_matrix List 0 queens sets up a matrix with all variables in 1 row This is the only extra goal that has to be added to enable monitoring alldistinct List constrain_queens List labeling List Figures 4 1 and 4 2 show the tool invoked with the example N Queens programs for 4 Queens at the start initially and during the execution of the program The name of the display window is specified by the second argument of make_display matrix 2 along with the module it is in The values of the terms are shown in the matrix which can be one dimensional as in this case or two dimensional Spy points can be set on each individual cell of the matrix so that execution will stop when the cell is updated The matrix can be killed using the Kill display button Left clicking on a cell will bring up a menu which shows the current and previous value of the term in the
143. cs 0 and statistics 2 predicates Simple Query This tool allows the user to send a simple query to ECL PS even while ECL PS is running some program and the Toplevel Query Entry window is unavailable Note that the reply is shown in EXDR format see the ECL PS Embedding and Interfacing Manual Library Help This tool allows you to browse the online help for the ECL PS libraries On the left is a tree display of the libraries available and the predicates they provide e Double clicking on a node in this tree either expands it or collapses it again e Clicking on an entry displays help for that entry to the right e Double clicking on a word in the right hand pane searches for help entries containing that string You can also enter a search string or a predicate specification manually in the text entry box at the top right If there is only one match detailed help for that predicate is displayed If there are multiple matches only very brief help is displayed for each to get detailed help try specifying the module and or the arity of the predicate in the text field 3 4 7 Preference Editor This tool allows you to edit and set various user preferences This include parameters for how TkECL PS will start up e g the amount of memory it will be able to use and a initial query to execute and parameters which affects the appearance of TkECL PS such as the fonts TkECL PS uses 11 3 5 How do I use eclipse 3 5 1 Getting
144. d uler must be explicitly invoked by calling wake 0 Only then does it start to execute the woken suspensions The reason for having wake O is to be able to schedule several suspension lists before the priority driven execution begins 17 9 Demon Predicates A common pattern when implementing data driven algorithms is the following variant of the report 1 example from above report X suspend report1 X 1 X gt constrained suspend report1 X var X gt writeln constrained X suspend report X 1 X gt constrained re suspend writeln instantiated X die Ji Here we have a goal that keeps monitoring changes to its variables To do so it suspends on some or all of those variables When a change occurs it gets woken does something and re suspends The repeated re suspending has two disadvantages it can be inefficient and the goal does not have a unique identifying suspension that could be easily referred to because on every re suspend a new suspension is created To better support this type of goals ECL PS provides a special type of predicate called a demon A predicate is turned into a demon by annotating it with a demon 1 declaration A demon goal differs from a normal goal only in its behaviour on waking While a normal goal dis appears from the resolvent when it is woken the demon remains in the resolvent Declaratively gt This mechanism may be reconsidered in a future release 179 this corres
145. d Ports ee 14 7 2 Attaching a Different User Interface 0 Switching To Creep Mode With CTRL C 0 2 000 15 Development Support Tools 15 1 15 2 15 3 15 4 15 5 15 6 15 7 15 8 15 9 Available Tools and Libraries 0 0 0 000000 pee ee ee Heuristic Program Checker 2 0 2 ee Document Generation Tools 2 0 0 0 o o Cross Referencing Tool aaa ee Pretty Printer Tool ata eh etc Boag eek ig eee ds la ces Timing Profiler ti edie On aka bx cna ee a Ee a a at Port Protlleri mor iat bob ee Beg Me ot A SS a a a Line coverage csi Sot nos to oe eats Se aa oe he de Hed SE o 15 8 1 Compilation ae a a a a ee a ee Ee a a 15 822 Results da is sel he a E ek es ae as PoR Mode analysis ei 209 a Rak gd Sa SUA oe eS et dS eal 16 Attributed Variables 16 1 16 2 16 3 16 4 16 5 16 6 16 7 Introduttionv 04 4 S24 AR A SR a Bae ee ee es Declaration 3 lt easel A A a a cn ee BA E Asa eGR O eS De ar ee eta tee NR Creating Attributed Variables 1 Decomposing Attributed Variables 2 2 Attribute Modification tar 28 408 wt fia a ae ea bs da eke Attributed Variable Handlers 2 2 0 a a 16 7 1 Printing Attributed Variables 2 0 0 0 0 0 eee ee 117 117 119 121 121 122 122 124 124 125 126 127 128 128 137 138 139 139 140 140 143 143 144 145 146 147 147 150 151 151 152 152 16 8 Built
146. d and the latter qualified attribute specification As the attribute name is usually identical with the source module name all occurrences of an attributed variable in the source module may use the unqualified specification If there are several occurrences of the same attributed variable in a single term only one occur rence is written with the attribute the others just refer to the variable s name e g p X X attr Attr or p X attr Attr X both describe the same term which has two occurrences of a single attributed variable with attribute attr Attr The following is a syntax error even when the attributes are identical p X attr Attr X attr Attr 16 4 Creating Attributed Variables A new attribute can be added to a variable using the tool predicate add_attribute Var Attr An attribute whose name is not the current module name can be added using add_attribute 3 which is its tool body predicate exported in sepia_kernel If Var is a free variable it will be bound to a new attributed variable whose attribute corresponding to the current module is Attr and all its other attributes are free variables If Var is already an attributed variable and its attribute is uninstantiated it will be bound to Attr otherwise the effect of this predicate will be the same as unifying Var with another attributed variable whose attribute corresponding to the current module is Attr 16 5 Decomposing Attributed Variables The attributes of
147. d float and to an uninstantiated variable in the case of prolog Whenever a typed array element is set type checking is carried out As an example of the use of a typed array consider the following goal which creates a 3 by 3 matrix describing a 90 degree rotation about the x axis of a Cartesian coordinate system local array rotate 3 3 integer setval rotate 0 0 1 setval rotate 1 2 1 setval rotate 2 1 1 The other elements of the above array are automatically initialised to zero The predicate current_array 2 is provided to find the size type and visibility of defined arrays of the array and its type to be found 79 current_array Array Props where Array is the array specification as in the declaration but it may be uninstantiated or partially instantiated and Props is a list indicating the array s type and visibility Non logical variables are also returned with Array being an atom and their type is prolog eclipse 1 local array pair 2 setval count 3 local array count 3 4 5 integer yes eclipse 2 current_array Array Props Array pair 2 Props prolog local More Array count Props prolog local More Array count 3 4 5 Props integer local More no more solution eclipse 3 current_array count X Y Z _ X 3 y 4 Z 5 yes 9 7 Global References Terms stored in non logical variables and arrays are copies of the se
148. d with another attributed variable or a non variable the attributed variable is bound like a standard variable to the other term and all handlers for the unify operation are invoked Note that several attributed variable bindings can occur e g during a head unification and also during a single unification of compound terms The handlers are only invoked at certain trigger points usually before the next predicate call test_unify the unification which is not supposed to trigger constraints propagation it is used e g in the not_unify 2 predicate The handler procedure is test_unify_handler Term Attribute where the arguments are the same as for the unify handler During the execution of the handler the attributed variable is bound to Term however when all local handlers succeed all bindings are undone compare_instances computation of instance subsumption and variance relationship as performed by the built ins instance 2 and variant 2 The handler procedure is instance_handler Res TermL TermR and its arguments are similar to the ones of the compare_instances 3 predicate The handler is invoked with one or both of TermL and TermR being attributed variables The task of the handler is to compare the two terms and instantiate Res to either or lt or fail if the result is gt according to the result of the comparison All bindings made in the handler will be undone after processing the local handlers copy_term the h
149. datagram sigio s signal when data comes bind s Address set_interrupt_handler io io_handler 0 connect_machines List Address AS soon as a message arrives to the socket the io signal will be sent and the handler reads the message io_handler set_flag enable_interrupts off read_string s n _ Message writeln Message set_flag enable_interrupts on Invoke eclipse on all machines with small load and let them execute the start 0 predicate connect_machines info RHost UpTime Users L1 _ _ Rest Host Port UpTime gt 0 it is not down Li lt 0 5 load not too high Users lt 3 not too many users 1 ca concat_string Command exec rsh RHost eclipse Host Port b nome 1p micha sepia4 up pl e start O _ 211 connect_machines Rest Host Port connect_machines _ Rest Address connect_machines Rest Address connect_machines _ ECLiPSe on remote hosts is invoked with eclipse host port b file pl e start It connects to the socket of the main process sends it a hello message and exits start is_built_in socket 3 to ignore non BSD machines argv 1 SHost argv 2 SPort atom_string Host SHost number_string Port SPort get_flag hostname LHost socket internet datagram s create the socket connect s Host Port connect to the main process printf s hello from sin b LHost
150. development tools window This is not recommended as there would not be any debugging facilities available after the disconnection the original tracer would not be restored It is possible to attach the remote development tools to any ECL PS session including one that is using the embedding Tcl Tk interface and indeed to TkKECL PS itself However using the tools via the embedding interface is usually the better option if available because the tools are more tightly coupled to ECL PS in this case This means that the communications between ECL PS and the tools are more efficient and hence something like the display matrix would perform more efficiently 25 26 Chapter 5 ECL PS specific Language Features ECL PS is a logic programming language derived from Prolog This chapter describes ECL PS specific language constructs that have been introduced to overcome some of the main deficiencies of Prolog 5 1 Structure Notation ECL PS structure notation provides a way to use structures with field names It is intended to make programs more readable and easier to modify without compromising efficiency it is implemented by preprocessing A structure is declared by specifying a template like this local struct book author title year publisher Structures with the functor book 4 can then be written as book book title tom sawyer book title tom sawyer year 1886 author twain which translat
151. e close Stream is used to close an open stream If a stream has several alias names closing any of them will close the actual stream All the other aliases should be closed as well or redirected to streams that are still open because otherwise they will continue to refer to the number of the already closed stream When an attempt is made to close a redirected system stream e g output the stream is closed but the system stream is reset to its default setting 10 1 5 Redirecting Streams The set_stream 2 primitive can be used to redirect an already existing symbolic stream to a new actual stream This is particularly useful to redirect e g the default output stream set_stream output MyStream so that all standard output is redirected to some other destination e g an opened file instead of the terminal Note that the stream modes read write must be compatible The redirection is terminated by calling close output which will reestablish the original meaning of the output stream 10 1 6 Finding Streams The predicate current_stream Stream can be used to backtrack over all the currently opened stream indentifiers but not their aliases 86 10 1 7 Stream Properties A stream s properties can be accessed using get_stream_info 3 get_stream_info Stream Property Value e g its mode line number file name etc Some stream properties can be modified using set_stream_property 3 set_stream_property Stream P
152. e argument is not instantiated it must be a free variable without any constraints espe cially it must not occur in any other argument and it cannot be a suspending variable The mode is not known or it is neither of the above ones Note that if the actual instantiation of a predicate call violates its mode declaration the be haviour is undefined Usually an unexpected failure occurs in this case This is in fact ambiguous the system predicate compiled_stream 1 which is exported from the module sepia kernel is more precise 3This style is not recommended 46 6 7 Inlining To improve efficiency calls to user defined predicates can be preprocessed and transformed at compile time The directive inline 2 e g inline mypred 1 mytranspred 2 arranges for mytranspred 2 to be invoked at compile time for each call to the predicate mypred 1 before this call is being compiled The transformation predicate receives the original call to mypred 1 as its first argument and is expected to return a replacement goal in its second argument This replacement goal replaces the original call in the compiled code Usually the replacement goal would be semantically equivalent but more efficient than the original goal When the transformation predicate fails the original goal is not replaced Typically a predicate would be defined together with the corresponding inlining transformation predicate e g inline double 2 trans_doub
153. e coercion Exprl is equal to Expr2 Expr1 1 Expr2 succeeds if after evaluation and type coercion Exprl is not equal to Expr2 8 1 1 Arithmetic Evaluation vs Arithmetic Constraint Solving This chapter deals purely with the evaluation of arithmetic expressions containing numbers No uninstantiated variables must occur within the expressions at the time they are evaluated This is exactly like arithmetic evaluation in procedural languages As opposed to that in arithmetic constraint solving one can state equalities and inequalities involving variables and a constraint solver tries to find values for these variables which satisfy 67 these constraints Note that ECL PS uses the same syntax in both cases but different imple mentations providing different solving capabilities See the chapter Common Solver Interface in the Constraint Library Manual for an overview 8 2 Numeric Types and Type Conversions ECL PS distinguishes four types of numbers integers rationals floats and bounded reals 8 2 1 Integers The magnitude of integers is only limited by your available memory However integers that fit into the word size of your computer are represented more efficiently this distinction is invisible to the user Integers are written in decimal notation or in base notation e g O 3 5 1024 16 f3ae 0 a 15511210043330985984000000 8 2 2 Rationals Rational numbers implement the corresponding mathematical domain i e ratios of tw
154. e enumeration constants in PASCAL If used like this an atom is in fact indivisible and there should be no need to ever consider the atom name as a sequence of characters When a program deals with text processing 1t should choose between string and list represen tation When there is a lot of manipulation on the single character level it is probably best to use the character list representation since this makes it very easy to write recursive predicates walking through the text The string type can be viewed as being a compromise between atoms and lists It should be used when handling large amounts of input when the extreme flexibility of lists is not needed when space is a problem or when handling very temporary data 5 4 2 Builtin Support for Strings Most ECL PS builtins that deliver text objects like getcwd 1 read_string 3 4 and many others return strings Strings can be created and their contents may be read using the string stream feature cf section 10 3 1 By means of the builtins atom _string 2 string list 2 number_string 2 and term_string 2 strings can easily be converted to other data types 5 4 3 Quoted lists As already discussed many Prologs use the double quotes as a notation for lists of characters By default ECL PS does not provide any syntactical support for such quoted lists However the user can manipulate the quotes by means of the set_chtab 2 predicate A quote is defined by setting the character class of
155. e for file s was written at the point of the include directive Note that this can have a different semantics from recursively compiling files using the compile directive because any new module in a recursively compiled file ends with the end of that file With include any new modules defined in that file will not end with the file Thus a compile directive should not be changed to an include directive if the target file contains definitions for a separate module The object code file with eco suffix will be loaded in preference to the Prolog source file by use_module 1 and lib 1 2 if both files are present On the other hand the compile predicates expect a source file and will normally not load an object code file The compiler generates different object code depending on the settings of various pragmas It is the settings of the pragmas at the time the object code is generated that determines what codes are generated rather than at load time The load time pragma settings have no effect on the object code that is loaded in so for example if the code was generated while the debug pragma is on but loaded while the nodebug pragma is on the loaded code is still the debuggable non optimised code Note that in addition to generating the object code for predicates found in the source file fcompile also generates the object code of any auxiliary predicates that are called in the source file These are the predicates that are generated by the compi
156. e form Head where Head is a structure or an atom A fact may be considered to be a rule whose body is always true Functor A functor is characterised by its name which is an atom and its arity which is its number of arguments Goal Clause See query Ground A term is ground when it does not contain any uninstantiated variables Head A head is a structure or an atom Instantiated A variable is instantiated when it has been bound to an atomic or a compound term as opposed to being uninstantiated or free See also ground List A list is a special type of term within Prolog It is a recursive data structure consisting of pairs whose tails are lists A list is either the atom called nil as in LISP or a pair whose tail is a list The notation ase b c is shorthand for a Eb Le 114 Name Arity The notation Name Arity is used to specify a functor of name Name with arity Arity Pair A pair is a compound term with the functor 2 dot which is written as HIT H is the head of the pair and T its tail Predicate A predicate is another term for a procedure PredSpec This is similar to the notation Name Arity Some built ins allow the arity to be omitted and to specify Name only This stands for all visible predicates with that name and any arity Program Clause A program clause or clause is either the term Head Body i e a compound term with the functor 2 or only a fact Query A query has the same f
157. e g erase_array matrix 2 The value of an element of the array is set using the setval 2 predicate The first argument of setval 2 specifies the element which is to be set the second specifies the value to assign to it The goal setval matrix 3 2 plato sets the value of element 3 2 of array matrix to the atom plato Similarly values of array elements are retrieved by use of the getval 2 predicate The first argument of getval 2 specifies the element to be referenced the second is unified with the value of that element Thus if the value of matrix 3 2 had been set as above the goal getval matrix 3 2 Val would unify Val with the atom plato Similarly to non logical variables the value of integer array elements can be updated using incval 1 and decval 1 It is possible to declare arrays whose elements are constrained to belong to certain types This allows ECL PS to increase time and space efficiency of array element manipulation Such an array is created for instance by the predicate local array primes 100 integer The second argument specifies the type of the elements of the array It takes as value an atom from the list float for floating point numbers integer for integers byte an integer modulo 256 or prolog any Prolog term the resulting array is the same as if no type was specified When a typed array is created the value of each element is initialised to zero in the case of byte integer an
158. e of Appendix E These rules are somewhat limited in scope The library is distributed as source and serves to provide a framework for the addition of a more comprehensive set of rules that are tailored to each individual developer Consider the following typographic mistakes in the n queens example 144 queen Data Out qperm Datas Out safe Out n0diag _ _ The tool is invoked using the lint 1 predicate with the source file specified as an atom or string lint queen File tmp queen ecl line 4 Singleton variables Data Datas File tmp queen ecl line 22 Questionable predicate name nOdiag Yes 0 01s cpu The checker identifies Data and Datas as being singleton variables and is dubious of the nOdiag predicate name Both are the result of programmer error Datas should read Data and n0diag as nodiag The lint 2 predicate allows a list of options to be specified that turn on and off the heuristic rules 15 3 Document Generation Tools The document generation tools library provides a set of predicates for the generation of doc umentation from ECL PS program sources The tools generate documentation by processing the comment 2 directives in each source file The following is an example comment for the n queens example comment for queen 2 comment queen 2 summary Program that solves the attacking Queens problem for an arbitrary number of queens index NQueens Problem ar
159. e section 17 7 3 Using suspend 3 we can rewrite our first delay clause example from above as follows report_binding X var X gt suspend report_binding X 0 X gt inst printf Variable has been bound to 4w n X Here when the predicate is called with an uninstantiated argument we explicitly suspend a goal with the condition that it be woken as soon as X becomes instantiated The priority is given as 0 which indicates the default priority 0 is not a valid priority itself Running this code produces the following report_binding X X X There is 1 delayed goal Yes 0 00s cpu When X is later instantiated it will wake up and print the message report_binding X writeln here X 99 here Variable has been bound to 99 X 99 Yes 0 00s cpu 170 17 7 Waking conditions The usual purpose of suspending a goal is to wait and resume it later when more information about its arguments is available In Logic Programming this is usually the case when certain events related to variables occur When such an event occurs the suspended goal is passed to the waking scheduler which puts it at the appropriate place in the priority queue of woken goals and as soon as it becomes first in the queue the suspended goal is executed The event which causes a suspended goal to be woken is usually related to one or more variables for example variable instantiation or a modification of a variable s attribute How
160. e set on a procedure using spy 1 which will also switch the debugger to leap and removed with nospy 1 They both accept a SpecList as argument Note that set_flag 3 can be used to set and reset spy points without switching the debugger on and without printing messages debugging 0 can be used to list the spied predicates and the current debugger mode eclipse 1 spy writeln 1 spypoint added to writeln 1 yes Debugger switched on leap mode eclipse 2 debugging Debug mode is leap writeln 1 is being spied yes eclipse 3 true writeln hello true B 2 O CALL writeln hello gt 1 leap hello B 2 O EXIT writeln hello gt c creep B 3 O CALL true gt 1 leap yes eclipse 4 trace Debugger switched to creep mode yes eclipse 5 true writeln hello true B 1 O CALL true gt c creep B 1 O EXIT true gt c creep B 2 O CALL writeln hello gt 1 leap hello B 2 O EXIT writeln hello gt 1 leap yes 14 5 Debugging Parts of Programs 14 5 1 Mixing debuggable and non debuggable code The debugger can trace only procedures which have been compiled in debug mode The com piler debug mode is by default switched on and it can be changed globally by setting the flag 122 debug_compile with the set_flag 2 predicate or using dbgcomp 0 or nodbgcomp 0 The global compiler debug mode can be overruled on a file by file basis using one of the compiler pragmas pragma nodebug pra
161. e they are defined and optionally in other modules when they are made available Structure names Structure declarations can be valid only local to a module or shared between several modules 55 Syntax settings These include operator declarations op 3 syntax options and character classes This means in particular that different modules can use different language dialects e g ECL PS vs ISO Prolog Container names These include the names of record keys nonlogical variables and references They are always local to the module where they are declared Initialization and Finalization goals Modules can have initialization and finalization goals attached see section 7 4 3 Note that every definition predicate structure etc is in some module there is no space outside the modules When you don t explicitly specify a module you inherit the module from the context in which you do an operation When you are using an interactive ECL PS toplevel a prompt will tell you in which module your input is read and interpreted 7 1 3 What Modules are There The module system is flat i e no module is part of another module and module names must be unique There are e a few basic modules that are part of the ECL PS runtime system and are always there The most important one is called eclipse_language and is by default imported into all other modules e the library modules every library consists of at least one module By convention that m
162. e to the corresponding forms book _ _ _ _ book _ tom sawyer _ _ book twain tom sawyer 1886 _ This transformation is done by the parser therefore it can be used in any context and is as efficient as using the structures directly The argument index of a field in a structure can be obtained using a term of the form FieldName of StructName E g to access ie unify a single argument of a structure use arg 3 like this arg year of book B Y which is translated into arg 3 B Y If a program is consistently written using curly brace and of syntax then the struct declaration can be modified fields added or rearranged without having to update the code anywhere else 27 5 1 1 Updating Structures To construct an updated structure i e a structure which is similar to an existing structure except that one or more fields have new values use the update_struct 4 built in which allows to do that without having to mention all the other field names in the structure 5 1 2 Arity and Functor of Structures The arity of a structure can be symbolically written using of 2 as follows property arity of StructName For example printf A book has d fields n property arity of book A book has 4 fields Yes Similarly the whole StructName Arity specification can be written as property functor of StructName which is used for the portray declaration in the example below 5 1 3 Printing Structures
163. e with the dif predicate could be for instance extended to work with finite domain or other constrained variables The modification is fairly simple 193 e When a variable in one term is matched against a subterm of the other term it might not necessarily be unifyable with it because there might be other constraints imposed on it Therefore not_unify 2 must be used to test it explicitly e The suspension should be woken not only on binding but on any constraining and thus the constrained list has to be used The predicate compare_args 5 is thus changed as follows compare_args _ _ _ _ Yes nonvar Yes compare_args A1 A2 Link NewLink Yes var Yes A1 A2 gt Link NewLink var A1 var A2 gt not_unify A1 A2 gt Yes yes suspend compare_args A1 A2 Link NewLink Yes 3 A1 A2 gt constrained Yes gt inst compare_terms A1 A2 Link NewLink Yes Now our dif3 4 predicate yields correct results even for constrained variables eclipse 1 dif3 A B Y N A 1 10 B 20 30 Y yes N N A A 1 10 B B 20 30 yes eclipse 2 dif3 A B Y N A 1 10 B 5 A 5 Y yes N N B 5 A A 1 4 6 10 yes eclipse 18 dif3 A B Y N A B 1 A 1 2 Y Y N no B 1 2 A 1 2 194 195 196 Chapter 19 Memory Organisation And Garbage Collection 19 1 Introduction This chapter may be skipped on a first reading I
164. eal rather than interval in order to avoid confusion with interval variables as used in the interval arithmetic constraint solvers 68 0 001__0 001 3 141592653__3 141592654 1e308__1 0Inf A bounded real is a representation for a real number that definitely lies somewhere between the two bounds but the exact value cannot be determined Bounded reals are usually not typed in by the user they are normally the result of a computation or type coercion All computations with bounded reals give safe results taking rounding errors into account This is achieved by doing interval arithmetic on the bounds and rounding the results outwards The resulting bounded real is then guaranteed to enclose the true real result Computations with floating point values result in uncertainties about the correct result Bounded reals make this uncertainty explicit A consequence of this is that sometimes it is conceptu ally not possible to decide whether two bounded reals are identical or not This occurs when the bounds of the compared intervals overlap In this case the arithmetic comparisons leave a ground delayed goal behind which can then be inspected by the user to decide whether the match is considered close enough The syntactial comparisons like 2 and 2 treat bounded reals simply as a pair of bounds and consider them equal when the bounds are equal 8 2 5 Type Conversions Note that numbers of different types never unify e g 3 3 1 3 0 and 3 0_
165. ecification error_handler 2 194 too many symbolic names of a stream error_handler 2 195 yield on flush io_yield_handler 2 196 trying to modify a system stream close_handler 2 197 use input or output instead of user error_handler 2 198 reading past the file end past_eof handler 2 210 Remember not inside a backtracking predicate error_handler 2 211 External function does not exist error_handler 2 212 External function returned invalid code error_handler 2 213 Error in external function error_handler 2 214 Licensing problem error_handler 2 240 C 1 10 Debugging Object Files Event Event Type Default Event Handler 230 uncaught exception error_handler 2 231 default help 0 message fail 0 249 debugger new suspensions event bip_delay 0 250 debugger init event trace_start_handler_tty 0 251 debugger builtin fail event bip_port 4 252 debugger port event trace_line_handler_tty 2 253 debugger call event neall 2 254 debugger exit event nexit 1 255 debugger redo event redo 5 256 debugger delay event ndelay 2 257 debugger wake event resume 2 258 debugger builtin call event bip_port 4 259 debugger builtin exit event bip_port 4 260 unexpected end of file error_handler 2 261 invalid saved state error_handler 2 262 can not allocate required space error_handler 2 263 can not save or restore from another break level error_handler 2 than level 0 264 not an
166. eclipse object file compiled_file_handler 3 265 bad eclipse object file version compiled_file_handler 3 267 predicate not implemented in this version error_handler 2 268 predicate not supported in parallel session error_handler 2 241 These handlers receive special arguments Event Second Argument Third Argument 252 trace_line port Port frame Frame undefined 264 File undefined 265 File undefined C 1 11 Extensions Event Event Type Default Event Handler 270 undefined variable attribute error_handler 2 271 bad format of the variable attribute error_handler 2 272 delay clause may cause indefinite delay warning_handler 2 273 delayed goals left delayed_goals_handler 3 274 stack of woken lists empty error_handler 2 280 Found a solution with cost cost_handler 2 The handlers for these events receive the following arguments Event Second Argument Third Argument 272 Culprit clause Module 273 list of sleeping suspensions undefined 280 Cost Goal undefined C 2 Stack Overflows When a stack overflows the system performs an exit_block 1 with an appropriate exit tag ie global_trail_overflow for overflows of the global trail stack that holds all the program s data structures local_control_overflow for overflows of the local control stack that holds information related to the control flow These exits can be caught by wrapping a goal that is likely to overflo
167. ed the module from where the procedure is called is printed in the trace line 1 1 CALL true gt show module 1 1 CALL eclipse true gt output mode This command allows to modify the options used when printing trace lines It first prints the current output_mode string as obtained by get_flag 2 then it prompts for a sequence of characters If it contains valid output mode flags the value of these flags is then inverted Typing an invalid character will display a list describing the different options Note that this command affects the global setting of output_mode 1 1 CALL X is length 1 2 gt current output mode is QPm toggle char V new output mode is VQPm 1 1 CALL X_72 is length 1 2 gt current output mode is QVPm toggle char O new output mode is OQVPm 1 1 CALL is X_72 length 1 2 gt current output mode is OQVPm toggle char new output mode is 0QVPm 1 1 CALL is X_72 length 1 2 C 3D DD a gt set a spy point Set a spy point on the displayed procedure the same as using the spy 1 predicate It is possible to set a spy point on any existing procedure even on a built in on external one If the procedure already has a spy point an error message is printed and any counter is ignored Note that the debugger does not check for spy points that occur inside skipped procedures or during the execution of any other skip command than the leap command 1 remove a s
168. ed with suspend 3 by using one of the following syntactic forms A B gt ic min A B gt ic min of ic Using these conditions we can define a more specialised form of the above report 1 predicate which only wakes up on the specified ic domain changes report_ic X var X gt writeln newdomain X suspend report_ic X 1 X gt ic min X gt ic max X gt ic hole writeln instantiated X 174 The behaviour is similar to above the predicate wakes up on every domain change X 1 5 report_ic X X gt 2 X lt 4 newdomain X 1 5 newdomain X13 5 instantiated 3 X 3 Yes 0 00s cpu Note that we now have to set up the delayed goal after the variable already has a domain This is because the ic specific waking conditions can only be used with ic variables not with domain less generic variables 17 7 3 Global Symbolic Waking Conditions Triggers Although waking conditions for a goal are usually related to variables within the goal s argu ments it is also possible to specify symbolic waking conditions which are unrelated to variables These are called triggers and are identified simply by an arbitrary name an atom Goals can be suspended on such triggers and the trigger can be pulled explicitly by program code in particular circumstances By combining triggers with the event mechanism chapter 13 it is even possible to wake goals in response to synchronous or asynchronous events A goal i
169. edence higher than 999 as structure arguments unless parenthesised nested_comments allow bracketed comments to be nested nl in quotes allow newlines to occur inside quotes no_array_subscripts disallow the ECL PS specific array subscript syntax no_attributes disallow the ECL PS specific syntax for variable attributes in curly braces no_blanks do not allow blanks between functor an opening parenthesis no_curly_arguments disallow the ECL PS specific syntax for structures with named argu ments in curly braces read_floats_as_breals read all floating point numbers as bounded reals rather than as floats The resulting breal is a small interval enclosing the true value of the number in decimal notation var_functor_is_apply allow variables as functors and parse a term like X A B C as apply X A B C Syntax option settings can be local to a module or exported e g local syntax_option not nl_in_quotes export syntax_option var_functor_is_apply A 6 Short and Canonical Syntax The following table summarises the correspondence between the short syntax forms supported by the parser and the term writer and their corresponding canonical forms Usually the pro grammer does not need to be concerned about the canonical represention because the short syntax is accepted by the parser and reproduced by the term writer unless canonical writing is explicitly requested Known as Short Canonical Active List A B A B alwa
170. edicate that prints a variable s current partial value e g domain whenever it changes 3Examples of such libraries are branch_and_bound changeset chr ech propia repair visualisation 173 report X var X gt writeln constrained X suspend report X 1 X gt constrained re suspend writeln instantiated X This now works with any library that implements a notion of constrainedness e g the interval solver library ic report X X 1 5 X gt 2 X K 4 constrained X constrained X 1 5 constrained X 3 5 instantiated 3 X 3 Yes 0 01s cpu The report 1 predicate is woken when the domain is initally attached to X whenever the domain gets reduced and finally when X gets instantiated 17 7 2 Library defined Waking Conditions on Variables Constraint solver libraries typically define additional specialised waking conditions for the type of variable that they implement For instance the interval solver lib ic defines the following conditions min wake when the minimum domain value changes max wake when the maximum domain value changes hole wake when the domain gets a new hole type wake when the variable type changes from real to integer Obviously these conditions only make sense for domain variables that are created by the lib ic library and are mainly useful for implementing extensions to this library e g new constraints The library defined waking conditions can be us
171. elected by indexing e using the if then else construct gt 3 e deliberate insertion of green cuts 19 1 4 The Global Stack The Global Stack holds Prolog structures lists strings and long numbers So the user s selection of data structures is largely responsible for the growth of this stack cf 5 4 In coroutining mode delayed goals also consume space on the Global Stack It also stores source variable names for terms which were read in with the flag variable_names being on When this feature is not needed it should be turned off so that space on the global stack is saved The global stack grows while a program creates data structures It is popped only on failure ECL PS therefore provides a garbage collector for the Global Stack which is called when a certain amount of new space has been consumed See section 19 2 for how this process can be controlled Note again that unnecessary nondeterminism reduces the amount of garbage that can be reclaimed and should therefore be avoided 199 19 1 5 The Trail Stack The Trail Stack is used to record information that is needed on backtracking It is therefore closely related to the Control Stack Ways to reduce Trail Stack consumption are e avoid unnecessary nondeterminism e supply mode declarations The Trail Stack is popped on failure and is garbage collected together with the Global Stack 19 2 Garbage collection The four stacks grow an shrink as needed In addition
172. en them A ECL PS process can communicate with other processes via streams and by sending and receiving signals 20 4 1 Process creation The built ins of the exec group and sh 1 fork a new process and execute the command given as the first argument Sorted by their versatility there are e sh Command e exec Command Streams e exec Command Streams ProcessId e exec_group Command Streams ProcessId With sh 1 or its synonym system 1 it is possible to call and execute any UNIX command from withing ECL PS However it is not possible to communicate with the process Moreover the ECL PS process just waits until the command has been executed The exec group makes it possible to set up communication links with the child process by specifying the Streams argument It is a list of the form Stdin Stdout Stderr and specifies which ECL PS stream should be connected to the stdin stdout or stderr of the child respectively Unless null is specified this will establish pipes to be created between the 206 ECL PS process and the child On Berkeley UNIX systems the streams can be specified as sigio Stream which will setup the pipe such that the signal sigio is issued every time new data appears on the pipe Thus by defining a suitable interrupt handler it is possible to service this stream in a completely asynchronous way 20 4 2 Process control The sh 1 and exec 2 built ins both block the ECL PS process until the child
173. ended goal specify its priority and its exact waking conditions When suspend Goal Prio CondList is called Goal will be suspended with priority Prio and it will wake up as soon as one of the conditions specified in the CondList is satisfied This list contains specifications of the form Suspend 3 is itself based on the lower level primitives make_suspension 3 and insert_suspension 4 which are described below 169 Vars gt Cond to denote that as soon as one of the variables in the term Vars satisfies the condition Cond the suspended goal will be woken and then executed as soon as the program priority allows it CondList can also be a single specification The condition Cond can be the name of a system defined waking condition e g X Y gt inst means that as soon as one or both of the variables X Y is instantiated the suspended goal will be woken These variables are also called the suspending variables of the goal Cond can also be the specification of a suspension list defined in one of currently loaded library attributes E g when the interval solver library lib ic is loaded either of A B gt ic min A B gt ic min of ic triggers the suspended goal as soon as the minimum element of the domain of either A or B are updated see Constraint Library Manual IC Library Another admissible form of condition Cond is trigger Name which suspends the goal on the global trigger condition Name se
174. ended file names It is recommended programming practice to give the Prolog source programs the suffix pl or ecl if it contains ECL PS specific code It is not enforced by the system but it simplifies managing the source programs The compile 1 predicate automatically adds the suffix to the filename so that it does not need to be specified if the literal filename can not be found the system tries appending each of the valid suffixes in turn and tries to find the resulting filename The system s list of valid Prolog suffixes is in the global flag prolog_suffix and can be examined and modified using get_flag 2 and set_flag 2 For example to add the new suffix pro use get_flag prolog_suffix Old set_flag prolog_suffix pro 0Old 17 18 Chapter 4 The TkECL PS Development Tools TkECL PS is a graphical user interface to ECL PS It is an alternative to the traditional textual line based user interface providing multiple windows menus and buttons to assist the user in interacting with ECL PS It consists of two major components e A graphical top level e A suite of development tools for aiding the development of ECL PS code TkECL PS is implemented in the Tcl Tk scripting language graphical toolkit 12 using the new ECL PS Tcl Tk interface 11 The development tools are designed to be independent of the top level so the user can develop their own applications with a graphical front end written in Tc
175. ent The remaining goals are ordered according to their priority At any time the system attempts to solve the most urgent subgoal first ECL PS currently supports a fixed range of 12 different priorities priority 1 being the most urgent and 12 the least urgent Figure 17 1 shows the structure of the resolvent When a toplevel goal is launched it has priority 12 and is the only member of the resolvent As execution proceeds active goals may be suspended and suspended goals may be woken and scheduled with a particular priority 17 2 2 Floundering The case that a subgoal remains suspended delayed at the end of the computation is sometimes referred to as floundering When floundering occurs it means that the resolvent could not be reduced to true or fail and that the answer bindings that have been found are valid only under the assumption that the remaining delayed goals are in fact true Since such a conditional answer is normally not satisfactory even though it may be correct it is then necessary to change the control aspect of the program The solution would usually be to either make further variable instantiations or to change control annotations The aim is to get the delayed goals out of the suspended state and into the scheduled state where they will eventually be executed and reduced As a rule of thumb goals will not suspend when all their arguments are fully instantiated Therefore a program that makes s
176. ent name is the symbolic name of the interrupt Apart from these special cases all other arguments will result in the specified predicate to be called when the appropriate interrupt occurs This general asynchronous interrupt handling is not supported on all hardware platforms neither in an embedded ECL PS including the tkeclipse development environment and is therefore deprecated 116 Chapter 14 Debugging 14 1 The Box Model The ECL PS debugger is based on a port model which is an extension of the classical Box Model commonly used in Prolog debugging A procedure invocation or goal is represented by a box with entry and exit ports Each time a procedure is invoked a box is created and given a unique invocation number The invocations of subgoals of this procedure are seen as boxes inside this procedure box Tracing the flow of the execution consists in tracing the crossing of the execution flow through any of the port of the box The five basic ports of the box model of ECL PS are the CALL EXIT REDO FAIL and NEXT ports the suspension facilities are traced through the DELAY and RESUME ports and the exceptional exit is indicated by LEAVE CALL When a procedure is invoked the flow of the execution enters the procedure box by its CALL port and enters the first clause box which could since not all clauses are tried some of them being sure to fail i e indexing is shown unify with the goal It may happen that a proced
177. ep 1 1 EXIT X 1 9 Y 1 9 2 1 CALL X 1 9 Y 1 9 gt 0 3 2 DELAY X 1 9 Y 1 9 gt 0 2 1 EXIT X 1 9 Y 1 9 gt 0 4 1 CALL Y 1 9 X 1 9 gt 0 5 2 DELAY Y 1 9 X 1 9 gt 0 BESSEN delayed goals 3 lt 2 gt X 1 9 Y 1 9 gt 0 5 lt 2 gt Y 1 9 X 1 9 gt 0 RS end gt 2 PTI PA 5 2 DELAY Y 1 9 X 1 9 gt 0 u par scheduled goals 9 gt creep gt creep gt creep gt creep gt creep gt delayed goals with prio all 9 gt Similar to the d command but displays only those delayed goals that are already scheduled for execution The optional argument allows to restrict the display to goal of a certain priority only Example eclipse 13 X Y Z 1 9 X gt Z Y gt Z Z gt 1 1 1 CALL X Y Z 1 9 gt creep EXIT X 1 9 Y 1 9 Z 1 9 1 9 gt creep gt creep 1 2 1 CALL X 1 9 Z 1 9 1 gt 0 gt creep 3 2 DELAY X 2 9 Z 1 8 gt 1 2 1 EXIT X 2 9 Z 1 8 1 gt 0 gt creep 5 2 DELAY Y 2 9 Z 1 8 gt 1 4 6 3 scheduled goals 5 lt 2 gt Y 2 9 Z 2 8 gt 1 ERES SARA end F 255 1 1 2 1 4 1 CALL Y 1 9 Z 1 8 1 gt 0 gt creep 2 1 1 2 gt creep EXIT Y 2 9 Z 1 8 1 gt 0 gt creep CALL O Z 1 8 2 gt 0 gt cree
178. er tab space or newline or by the end of file The exact definition of the term syntax can be found in appendix A If end of file has been reached then an exception is raised the default handler causes the atom end_of_file to be returned A term may be read from a stream other than the current input stream by the call read Stream Term which reads the term from the named stream For additional information about other options for reading terms in particular for how to get variable names refer to readvar 3 read_term 2 and read_term 3 For reading and pro cessing complete ECL PS source code files use the library source_processor For output the goal write Term writes Term to the current output stream This is done by taking the current operator declarations into account Output produced by the write 1 2 predicate is not necessarily in a form suitable for subsequent input to a Prolog program using the read 1 predicate for this purpose writeq 1 2 is to be used The goal 88 write Stream Term writes Term to the named output stream For more details about how to output terms in different formats see section 10 4 When the flag variable_names is switched off the output predicates are not able to write free variables in their source form i e with the correct variable names Then the variables are output in the form N where N is a number which identifies the variable but note that these numbers may change on garba
179. er Tool The pretty printer library provides a set of predicates for the printing of a file s contents as a file in a number of formats In particular an ECL PS source file can be converted into an HTML document with proper indentation syntax colouring hyperlinks from predicate uses to definition and hyperlinks to documentation The pretty_print 2 predicate is used to print the file or list of files A list of options can be given which modifies the format of the output file its location etc The following creates a pretty directory in the current directory Within the pretty directory reside index html and queen html where queen html is the queen module pretty printed in HTML pretty_printer pretty_print queen Writing examples pretty queen html 15 6 Timing Profiler The profiling tool helps to find hot spots in a program that are worth optimising It can be used any time with any compiled Prolog code it is not necessary to use a special compilation The profiler requires a small amount of hardware compiler dependent code and may therefore not be available on all platforms 147 daVinci V2 1 mE File View Navigation Abstraction Layout Options k al a Sal E l sepia_kernel comment 2 sepia_kernel is 2 sepia_kernel 3 Figure 15 1 Call graph for queen example with built in predicates mode or set any flags Note however that it is not available
180. er is the natural order i e if Array a b c d e then for suc cessive iterations X is bound in turn to a b c d e and f X is a local variable in Goals Cannot be used for constructing a term 30 foreachelem X Array Idx same as before but Idx is set to the index position of X in Array i e subscript Array Idx X is true Idx is a local variable in Goals foreachindex Idx Array like foreachelem 3 but returns just the index position and not the element for I MinExpr MaxExpr iterate Goals with I ranging over integers from MinExpr to MaxExpr I is a local variable in Goals MinExpr and MaxExpr can be arithmetic expressions Can be used only for controlling iteration i e MaxExpr cannot be uninstantiated for I MinExpr MaxExpr Increment same as before but Increment can be specified it defaults to 1 multifor List MinList MaxList like for 3 but allows iteration over multiple indices saves writing nested loops Each element of List takes a value between the corresponding elements in MinList and MaxList Successive iterations go through the possible combinations of values for List in lexico graphic order List is a local variable in Goals MinList and MaxList must be either lists of arithmetic expressions evaluating to integers or arithmetic expressions evaluating to integers in the latter case they are treated as lists containing the evaluated integer re peated an appropriate number of times
181. ers are inserted The documentation for the ccompile 2 predicate provides for a full list of the available flags 15 8 2 Results To generate an HTML file containing the coverage counter results the result 1 predicate is used coverage result queen Writing examples coverage queen html index pl compiled traceable 335304 bytes in 0 17 seconds Yes 0 18s cpu This creates the result file coverage queens html which can be viewed using any browser It contains a pretty printed form of the source annotated with the values of the code coverage counters as described above As a side effect the coverage counters will be reset 15 9 Mode analysis The mode_analyser library is a tool that assists in the generation of the mode 1 directive for predicate definitions This directive informs the compiler that the arguments of the specified predicate will always have the corresponding form when the predicate is called The compiler utilises this information during compilation of the predicate in order to generate more compact and or faster code Specifying the mode of a predicate that has already been compiled has no effect unless it is recompiled If the specified procedure does not exist a local undefined procedure is created The mode analyser inserts instrumentation into the clause definitions of predicates during com pilation in order to record mode usage of each predicate argument The code should then be run as many times as is necessary
182. es during its debugging the system behaves as expected the existing clauses are always replaced The handler for this error can of course be changed if required If it is set to true O for instance the dynamic 1 declaration is be just silently accepted without erasing any clauses and without printing an error message 96 11 2 Altering programs at run time The Prolog database can be updated during the execution of a program ECL PS allows the user to modify procedures dynamically by adding new clauses via assert 1 and by removing some clauses via retract 1 These predicates operate on dynamic procedures if it is required that the definition of a procedure be altered through assertion and retraction the procedure should therefore first be declared dynamic see the previous section The effect of assert 1 and retract 1 on static procedures is explained below The effect of the goal assert ProcClause where ProcClause is a clause of the procedure Proc is as follows 1 If Proc has not been previously defined the assertion raises an exception however the default handler for this exception just declares the given procedure silently as dynamic and executes the assertion 2 If Proc is already defined as a dynamic procedure the assertion adds ProcClause to the database after any clauses already existing for Proc 3 If Proc is already defined as a static procedure then the assertion raises an exception The goal retract Clause
183. etract 1 the system should be informed that the procedure will be dynamic since these predicates are designed to work on dynamic procedures If assert 1 is applied on a non existing procedure an error is raised however the default error handler for this error only declares the procedure as dynamic and then makes the assertion A procedure is by default static unless it has been specifically declared as dynamic Clauses of static procedures must always be consecutive they may not be separated in one or more source files or by the user from the top level If the static procedure clauses are not consecutive each of the consecutive parts is taken as a separate procedure which redefines the previous occurrence of that procedure and so only the last one will remain However whenever the compiler encounters nonconsecutive clauses of a static procedure in one file it raises an exception whose default handler prints a warning but it continues to compile the rest of the file If a procedure is to be dynamic the ECL PS system should be given a specific dynamic decla ration A dynamic declaration takes the form dynamic SpecList The predicate is dynamic 1 may be used to check if a procedure is dynamic is_dynamic Name Arity When the goal compile Somefile is executed and Somefile contains clauses for procedures that have already been defined in the Prolog database those procedures are treated in one of two ways If such a procedure is dynami
184. event begins In this case the event handler is responsible for reenabling event handling explicitly before returning by calling events_nodefer 0 For instance set_event_handler my_event defers my_handler 0 my_after_handler event handling is deferred at this point lt deal with event gt events_nodefer allow other events to be handled again In the presence of other event handlers which can cause aborts this will protect the handler code from being preempted 13 2 Errors Error handling is one particular use of events The main property of error events is that they have a culprit goal ie the goal that detected or caused the error The error handler obtains that goal as an argument The errors that the system raises have numerical identifiers as documented in appendix C User defined errors have atomic names they are the same as events Whenever an error occurs the ECL PS system identifies the type of error and calls the appropriate handler For each type of error it is possible for the user to define a separate handler This definition will replace the default error handling routine for that particular error all other errors will still be handled by their respective handlers It is of course possible to associate the same user defined error handler to more than one error type When a goal is called and produces an error execution of the goal is aborted and the appropriate error handler is invoked This invocatio
185. ever it is also possible to trigger suspension with symbolic events not related to any variable 17 7 1 Standard Waking Conditions on Variables There are three very general standard waking conditions which can be used with any variable They are in order of increasing generality inst wake when a variable gets instantiated bound wake when a variable gets instantiated or bound to another variable constrained wake when a variable gets instantiated or bound to another variable or becomes otherwise constrained Each condition subsumes the preceding more specific ones Waking on Instantiation inst To wake a goal when a variable gets instantiated the inst condition is used For example the following code suspends a goal until variable X is instantiated suspend writeln woken X 0 X gt inst X X There is 1 delayed goal Yes 0 00s cpu If this variable is later instantiated bound to a non variable the goal executes in a data driven way suspend writeln woken X 0 X gt inst X 99 woken 99 X 99 Yes 0 00s cpu If we specify several instantiation conditions for the same goal the goal will wake up as soon as the first of them occurs suspend writeln woken X Y 0 X Y gt inst X 99 woken 99 Y X 99 Y Y Yes 0 00s cpu 171 It is not possible to specify a conjunction of conditions directly Let us now suppose we want to implement a predicate succ X Y which is true when Y
186. execution e g when examining ancestors or delayed goals CALL a procedure is called for the first time concerning a particular invocation DELAY a procedure delays EXIT a procedure succeeds FAIL a procedure fails there is no other solution LEAVE a procedure is left before having failed or exited because of a call to exit_block 1 NEXT the next possibly matching clause of a procedure is tried because unification failed or a sub goal failed ELSE the next branch of a disjunction is tried because some goal in the previous branch failed REDO a procedure that already gave a solution is called again for an alternative RESUME a procedure is woken the flow enters the procedure box as for a call because of a unification of a suspending variable This only appears if the goal is executing at a different priority than 12 the normal priority The number between the angled brackets shows the priority between 1 and 11 that the goal is executed at For the tty debugger the optional module name followed by a colon Printing of the module can be enabled and disabled by the debugger command m If it is enabled the module from where the procedure is called is displayed By default the module printing is disabled With tkeclipse the module name is not displayed with the traceline instead you can get the information by right holding the mouse button over the trace line in the call stack window 120 9 The goal is printed accordi
187. f w as term do not assume any particular meaning of the printed term as clause C print the term as a clause apply clause transformations as goal G print the term as a goal apply goal transformations attributes none do not print any variable attributes attributes pretty m print attributes using the corresponding print handlers attributes full M print the full contents of all variable attributes compact false print extra blank space around operators after commas etc for better readability compact true K don t print blank space unless necessary depth Max lt Max gt print the term only up to a maximum nesting depth of Max a positive integer depth 0 observe the stream specific or global flag print_depth depth full D print the whole term may loop when the term is cyclic dotlists false write lists in square bracket notation e g a b dotlists true write lists as terms with functor 2 newlines false print newlines inside quotes as escape sequence n newlines true N print newlines as line breaks even inside quotes numbervars false do not treat VAR 1 terms specially numbervars true I print terms of the form VAR N as named variables VAR 0 is printed as A VAR 25 as Z SVAR 26 as Al and so on When the argument is an atom or a string just this argument is printed operators true obey operator declarations and print prefix infix postfix operators false O ignore operator declarations
188. form of circularity in the import structure for local initialization use local initialization 57 7 2 4 Definitions Visibility and Accessibility For a given predicate name and arity the following rules hold e Every module can contain at most one definition this definition may be local or exported e In every module at most one definition is visible if there is a definition in the module itself this is also the visible one in the module otherwise if there is an unambiguous import or reexport this is the visible one otherwise no definition is visible e All exported definitions are accessible everywhere this might require explicit module qualification see 7 3 2 7 3 Advanced Topics 7 3 1 Solving Name Conflicts Name conflicts occur in two flavours Import Import conflict this is the case when two or more imported modules provide a predicate of the same name Import Local conflict this is the case when a local or exported predicate has the same name as a predicate provided from an imported module Conflicts of the first type are accepted silently by the system as long as there is no reference to the conflict predicate Only when an attempt is made to access the conflict predicate is an error raised The conflict can be resolved by explicitly importing one of the versions e g lib ria exports gt 2 lib eplex exports gt 2 import gt 2 from ria re
189. g object code Traditionally when an ECL PS file is compiled it is loaded immediately into the system Some time it is useful to generate object code which can then be loaded later perhaps even in a different session of ECL PS maybe on a different platform This functionality is provided by the fcompile library In order to use this facility the fcompile library should be loaded first lib fcompile 51 fcompile File can then be used to generate an object file from an ECL PS source file The object file has the same base name as the source file File but with the suffix eco attached fcompile generates an object file by compiling an ECL PS source file normally and then disassembling the compiled code into an object form which is written to the object file This object form is platform independent and can be loaded into ECL PS running on a different platform from the one that generated it see section 6 10 1 for restrictions The object file is generated in the current working directory Options can be specified for fcompile by using fcompile 2 fcompile is designed mainly for generating an object file for a whole module The include direc tive allows multiple source files to be compiled into one object file When fcompile encounters an include directive in the source file include File it will generate the object code for the file s in File in place of the directive The effect is as if the actual source cod
190. g the goal a summary of the current subterm generally its functor and arity if the subterm is a structure is shown in brackets par move down to parth argument The most basic command of inspect subterm is to move the current subterm to an argu ment of the existing current subterm This is done by typing a number followed by carriage return or by typing which causes the debugger to prompt for a number In both cases the number specifies the argument number to move down to In the following example the style of the command is used to move to the first argument and the number style of the command to move to the third argument 1 1 CALL foo a g b 1 21 X gt inspect arg 1 lt NL gt INSPECT atom gt 1 1 CALL foo a g b 1 21 X gt 3 lt NL gt X INSPECT var gt The new current subterm is printed followed by the INSPECT trace line Notice that the summary shows the type of the current subterm instead of Name Arity since in both cases the subterms are not structures If the current subterm itself is a compound term then it is possible to recursively navigate into the subterm 1 1 CALL foo a glb 1 21 X gt 2 lt NL gt g b 1 21 INSPECT g 2 gt 2 lt NL gt 1 2 INSPECT list 1 head 2 tail gt 2 lt NL gt 2 INSPECT list 1 head 2 tail gt Notice that lists are treated as a structure with arity 2 although the functor 2 is not printed In addition to com
191. ge collection and can therefore not be used to identify the variable in a more permanent way Occasionally the number will be prefixed with the lower case letter 1 indicating that the variable is in a short lived memory area called the local stack see 19 10 2 4 General Parsing and Text Generation Reading and writing of I O formats that cannot be handled by the methods discussed above are probably best done using Definite Clause Grammar DCG rules See chapter 12 3 for details 10 2 5 Flushing On most devices output is buffered i e any output does not appear immediately on the file pipe or socket but goes into a buffer first To make sure the data is actually written to the device the stream usually has to be flushed using flush 1 If this is forgotten the receiving end of a pipe or socket may hang in a blocking read operation It is possible to configure a stream such that it is automatically flushed at every line end see set_stream_property 3 10 2 6 Prompting Input streams on terminals can be configured to print a prompt whenever input is required see set_stream_property 3 10 2 7 Positioning Streams that are opened on files or strings can be positioned ie the read write position can be moved forward or backwards This is not possible on pipes sockets queues and terminals To specify a position in the file to write to or read from the predicate seek 2 is provided The call seek Stream Pointer moves the current
192. gma debug Once a program or a part of it has been debugged it can be compiled in nodbgcomp mode so that all optimisations are done by the compiler The advantages of non debugged procedures are e They run slightly faster than the debugged procedures when the debugger is switched off When the debugger is switched on the non debugged procedures run considerably faster than the debugged ones and so the user can selectively influence the speed of the code which is being traced as well as its space consumption e Their code is shorter than that of the debugged procedures Although only procedures compiled in the dbgcomp mode can be traced it is possible to mix the execution of procedures in both modes Then calls of nodbgcomp procedures from dbgcomp ones are traced however further execution within nodbgcomp procedures i e the execution of their subgoals no matter in which mode is not traced In particular when a nodbgcomp procedure calls a dbgcomp one the latter is normally not traced There are two important exceptions from this rule e When a debuggable procedure has delayed and its DELAY port has been traced then its RESUME port is also traced even when it is woken inside non debuggable code e When non debuggable code meta calls a debuggable procedure i e via call 1 then this procedure can be traced This is a useful feature for the implementation of meta predi cates like setof 3 because it allows to hide the details of
193. gs Data List modelling initial state of queens on board Args Solution list of Y coordinate of each queen on the board amode queen amode queen amode queen resat yes 145 fail_if A solution cannot be found where all queens are safe from attack by every other see_also queens8 1 queensN 1 desc html The problem is to arrange a specified number of queens on a chessboard such that no queen attacks any other queen The predicate takes a list representing the initial state of the queens on the board with each element representing a queen and its current Y coordinate If a solution is found a list is returned specifying the safe Y coordinate for each queen 1 end of comment directive for queen 2 There are two pertinent predicates for document generation The first icompile 2 gener ates an information file eci by extracting information from a source file ecl The second eci_to_html 3 processes this information file to produce readable HTML and plain text files By default these files are placed in a subdirectory with the same name as the information file but without the extension The generated files are index html containing a summary descrip tion of the library plus one HTML and one plain text file for each predicate that was commented using a comment 2 directive in the source The following produces the queen eci file and a queen directory in the current directory W
194. has finished For more sophisticated applications the processes have to run in parallel and be synchronised explicitly This can be achieved with exec 3 or exec_group 3 These return immediately after having created the child process and unify its process identifier Pid with the their argument The Pid can be used to e send signals to the process using the built in kill Pid Signal e wait for the process to terminate and obtain its return status wait Pid Status The difference between exec 3 and exec_group 3 is that the latter creates a new process group for the child such that the child does not get the interrupt hangup and kill signals that are sent to the parent The process identifier of the running ECL PS and of its parent process are available as the global flags pid and ppid respectively They can be accessed using get_flag 2 or env 0 Here is an example of how to connect the UNIX utility be the arbitrary precision arithmetic language to a ECL PS process We first create the process with two pipes for the child s standard input and output Then by writing and reading these streams the processes can communicate in a straightforward way Note that it is usually necessary to flush the output after writing into a pipe eclipse 1 exec bc in out P P 9759 yes eclipse 2 writeln in 12345678902321 2132 flush in yes eclipse 3 read_string out n _ Result Result 26320987419748372 yes In
195. he socket to a name Any other process can then connect directly to this socket using the connect 2 predicate and send data there This connection can be temporary and after writing the message to the socket the process can connect it to another socket or just disconnect it by calling connect Socket 0 Such datagram connection works only in one direction namely from the process that called connect 2 to the process that called bind 2 however the connection in the other direction can be established in the same way Since ECL PS does not provide a link to the system call sendto the address where the packet should be sent to can be specified only using connect 2 If the next packet is to be sent to a different address a new connect 2 call can be used The socket can be disconnected by calling connect s 0 0 The functionality of recufrom is not available i e the sender has to identify itself explicitly in the message if it wants the receiver to know who the sender was Below is an example of a program that starts ECL PS on all available machines which are not highly loaded and accepts a hello message from them Note the use of rsh to invoke the process on the remote machine and pass it the host name and port address Note that this example is Unix specific Invoke ECLiPSe on all available machines and accept a hello message from them connect_machines machine_list List make a list of machines from ruptime socket internet
196. hich would trigger the unification handlers but instead the call argument is decomposed into the variable and its attribute s get_attr X A Attr oat A Attr This predicate can be used to return the attribute of a given attributed variable and fail if it is not one e Replacing other metalogical operations e g var 1 test Since a nonvariable in the head of a matching clause matches only a nonvariable explicit variable tests and or cuts may become obsolete If some argument positions of a matching clause are declared as output in a mode declaration then they are not unified using pattern matching but normal unification in this case then the variable is normally bound The above example can thus be also written as mode get_attr get_attr X A A gt true but in this case it must not be called with its second argument already instantiated 5 6 Soft Cut Sometimes it is useful to be able to remove a choice point which is not the last one and to keep the following ones for example when defining an if then else construct which backtracks also into the condition This functionality is usually called soft cut in the Prolog folklore When you define the operator op 1050 xfx gt and import x gt 2 from sepia_kernel then the expression Ax x gt B C 40 is evaluated as a soft cut if A succeeds B is executed and on backtracking subsequent solutions of A are returned but C is never execu
197. hin a code block 3 At the end of a code block A code block is defined to be a conjunction of predicate calls ie a sequence of goals separated by commas The counter values do not only show whether all code points were reached but also whether subgoals failed or aborted in which case the counter before a subgoal will have a higher value than the counter after it 15 8 1 Compilation In order to add the coverage counters to code it must be compiled with the ccompile 1 predicate which can be found in the coverage library The ccompile 1 predicate note the initial c stands for coverage can be used in place of the normal compile 1 predicate to compile a file with coverage counters The following shows the results of compiling the n queens example coverage ccompile queen queen ecl compiled traceable 6016 bytes in 0 01 seconds coverage inserted 20 coverage counters into module queen Yes 0 14s cpu 151 Once compiled predicates can be called as usual and will by default have no visible side effects Internally however the counters will be incremented as the execution progresses The following demonstrates this for a single solution to the queen predicate queen queen 1 2 3 4 5 6 7 8 9 1 Out The counter results are retrieved as demonstrated in the subsequent section The two argument predicate ccompile 2 can take a list of name value pairs which can be used to control the exact manner in which coverage count
198. ich occur in the general term Vars and for each of them locate the attribute which corresponds to the current module or the Module argument respectively This attribute must be a structure otherwise an error is raised which means that the attribute has to be initialised before calling insert_suspension 4 3 Finally the Index th argument of the attribute is interpreted as a suspension list and the suspension Susp is inserted at the beginning of this list A more user friendly interface to access suspension lists is provided by the suspend 3 predicate 17 8 6 User defined Suspension Lists Many important attributes and suspension lists are either provided by the suspend attribute or by libraries like the interval solver library lib ic For those suspension lists initialisation and waking is taken care of by the library code For the implementation of user defined suspension lists the following low level primitives are provided init_suspension_list Position Attribute Initialises argument Position of Attribute to an empty suspension list merge_suspension_lists Pos1 Attr1 Pos2 Attr2 Destructively appends the first suspension list argument Pos of Attr1 to the end of the second argument Pos2 of Attr2 enter_suspension_list Pos Attr Susp Adds the suspension Susp to the suspension list in the argument position Pos of Attr The suspension list can be pre existing or the argument could be uninstantiated in which case a ne
199. ied there e goal Instead of starting an interactive toplevel the system will execute the goal goal goal is given in normal Prolog syntax and has to be quoted if it contains any characters that would normally be interpreted by the shell The e option can be used together with the b option and is executed afterwards Only one e option is allowed The exit status of the ECL PS process reflects success or failure of the executed Prolog goal 0 for success 1 for failure 2 for abort When you only have a runtime installation of eclipse the e option is compulsory because a runtime system does not have an interactive toplevel g size This option specifies to which limit the memory consumption of the ECL PS global trail stack can grow The size is specified in kilobytes followed by an optional K in megabytes followed by M or in gigabytes followed by G The default is 128M ie 128 Megabytes The amount required for this stack depends on the program s data structures and may need to be increased for very large applications l size This option specifies to which limit the memory consumption of the ECL PS lo cal control stack can grow The size is specified in kilobytes followed by an optional K in megabytes followed by M or in gigabytes followed by G The default is 128M ie 128 Megabytes The local control stack is unlikely to require more than this default If it does it is probably caused by a programming error
200. if a Prolog predicate calls an external or built in predicate written in C the time will be assigned to the Prolog predicate The predicate profile Goal Flags can be used to change the way profiling is made Flags is a list of flags Currently only the flag simple is accepted and it causes separate profiling of simple predicates i e those written in C The problem with the results displayed above is that the sampling frequency is too low when compared to the total user time spent executing the goal In fact in the above example the profiler was only able to take two samples before the goal terminated The frequency at which the profiler samples is fixed so in order to obtain more representative results one should have an auxiliary predicate which calls the goal a number of times and compile and profile a call to this auxiliary predicate eg queen_100 for _ 1 100 1 do queen 1 2 3 4 5 6 7 8 9 Out Note that when compiled the above do 2 loop would be efficiently implemented and not cause overhead that would distort the measurement Section 5 2 presents a detailed description of logical loops profile queen_100 goal succeeded PROFILING STATISTICS Goal queen_100 Total user time 3 19s Predicate Module Time Time Cum nodiag 3 eclipse 52 2 1 67s 52 2 qdelete 4 eclipse 27 44 0 87s 79 6 qperm 2 eclipse 17 0 0 54s 96 5 safe 1 eclipse 2 8 0 09s 99 4 queen 2 eclipse 0 6 0 02s 100 0 Yes 3 33s cpu
201. important notion in UNIX It can be read and changed within the ECL PS system by using getcwd 1 and cd 1 respectively The current working directory is accessible as a global flag as well Reading and writing this flag is equivalent to the use of getcwd 1 and cd 1 eclipse 1 getcwd Where Where usr name prolog yes eclipse 2 cd yes eclipse 3 get_flag cwd Where Where usr name yes All ECL PS built ins that take file names as arguments accept absolute pathnames as well as relative pathnames starting at the current directory 20 3 2 Looking at Directories To look at the contents of a directory read_directory 4 is available It takes a directory pathname and a filename pattern and returns a list of subdirectories and a list of files matching the pattern The following metacharacters are recognised in the pattern matches an arbitrary sequence of characters matches any single character matches one of the characters inside the brackets unless the first one is a in which case it matches any character but those inside the brackets eclipse 1 read_directory usr john Dirlist Filelist Dirlist subdir1 subdir2 Filelist one c two c three pl four pl1 yes 20 3 3 Checking Files For checking the existence of files exists 1 or the more powerful existing_file 4 is used For accessing any file properties there is get_file_info 3 It can return file permissions type
202. ing limits are 1 The maximum arity of a predicate in ECL PS is 255 this value can be queried using get_flag max_predicate_arity X Note however that the arity of compound terms is un limited 2 The maximum arity of external predicates in the current implementation of ECL PS is 16 3 The stack and heap sizes have virtual memory limits which can be changed using the g l s and p command line options or the ec_set_option function in case of an embedded ECL PS 4 When the occur check is disabled the default it is possible and sometimes useful to create cyclic data structures E g the unification of X and g X in X g X will result in a cyclic structure X g g g g gl Not all ECL PS built in predicates handle cyclic terms gracefully Care must be taken with all predicates which traverse the whole term e g copy_term 2 nonground 1 term_variables 2 term_hash 4 writeq 2 assert 1 compile_term 1 These will typically loop or overflow a stack when applied to cyclic terms Note however that start ing from version 5 6 cyclic terms are allowed in all heap copying predicates setval 2 bag_enter 2 shelf_set 3 store_set 3 record 2 etc 251 Index remove a spy point debugger cmd 138 X3 d 100 gt 2 41 50 TENE lt print depth debugger cmd 121 lt set print depth debugger cmd 137 lt 2 50 67 gt set indentation step width debugger cmd 138 gt
203. ing manual and the example programs for more details on the initialisation needed The user should most likely provide a connection for the output stream of ECL PS so that out put from ECL PS will go somewhere in the GUI In addition especially during the development it is also useful to connect the error stream to some window so that errors such as ECL PS compilation errors are seen by the user This can be done using the ec_queue_connect Tcl command described in the embedding manual Output from ECL PS need not be sent to a Tk window directly The Tcl Tk code which receives the output can operate on it before displaying it It is intended that all such graphical operations should be performed on the Tcl side rather than having some primitives provided on the ECL PS side The user can also provide balloon help to his her own application The balloon help package is part of the Megawidget developed by Jeffrey Hobbs and used in TkECL PS In order to define a balloon help for a particular widget the following Tcl code is needed balloonhelp lt path gt lt text gt where lt path gt is the pathname of the widget and lt text gt is the text that the user wants to display in the balloon 4 2 2 Using the Remote Development Tools The user can also use the development tools via the remote_tools library In this case the development tools are run as a separate program from the ECL PS session and is attached to it via the Tcl Tk remo
204. ioned so far The dictionary shrinks on dictionary garbage collections which are triggered au tomatically after a certain number of new entries has been made see set_flag 2 The dictionary is designed to hold several thousand entries the current number of entries can be queried with statistics 0 2 various descriptors The system manages a number of other internal tables for modules predicates streams operators etc that are also allocated on the heap This space is reclaimed when the related Prolog objects cease to exist I O buffers When streams are opened the system allocates buffers from the heap They are freed when the stream is closed allocation in C externals If third party libraries or external predicates written in C C call malloc or related C library functions this space is also allocated from the heap It is the allocating code s responsibility to free this space if it becomes unused 198 Note that the distinction between shared and private heap is only relevant for parallel ECL PS systems where multiple workers share the shared heap but have their own private heap and stacks 19 1 2 The Local Stack The Local Stack is very similar to the call return stack in procedural languages It holds Prolog variables and return addresses Space on this stack is allocated during execution of a clause and deallocated before the last subgoal is called due to tail recursion last call optimisation This deallocation
205. ipped If on the predicate s subgoal will not be traced even if it has been compiled in debug compile mode The value of this property can be changed with skipped 1 unskipped 1 or set_flag 3 start_tracing If on a call to the predicate will activate the debugger if it is not already running Only the execution within this predicate s box will be traced This is useful for debugging part of a big program without having to change the source code The effect is similar to wrapping all call of the predicate into trace 1 14 4 Starting the Debugger Several methods can be used to switch the debugger on If the textual interactive top level is used the commands trace 0 and debug 0 are used to switch the debugger on for the following queries typed from the top level trace 0 will switch the debugger to creep mode whereas debug 0 will switch it in it leap mode For the tkeclipse graphical toplevel the debugger may be switched on by starting the tracer from the Tools menu before executing the query This puts the debugger in creep mode 121 When the debugger is in it creep mode it will prompt for a command at the crossing of the first port of a leashed procedure When the debugger is in leap mode it will prompt for a command at the first port of a leashed procedure that has a spy point The debugger is switched off either from the toplevel with the commands nodebug 0 or notrace 0 or by typing n or N to the debugger prompt A spy point can b
206. is Expr da We have used the built in predicate nonground 2 which tests a term for groundness and returns one of its variables if it is nonground Note also that in this implementation the same eval_lazy 2 goal gets woken and re suspended possibly many times See section 17 9 below for how to address this inefficiency Waking on Binding bound Sometimes it is interesting to wake a goal when the number of variables among its arguments is reduced This happens not only when a variable disappears due to instantiation but also 172 when two variables get unified the result being a single variable Consider the succ_eager 2 predicate above we know that a goal like succ_eager X X must always fail because an integer cannot be equal to its successor However the above implementation does not detect this case until X gets instantiated The bound waking condition subsumes the inst condition but also wakes when any two of the variables in the condition specification get unified with each other aliased Using this property we can improve the implementation of succ_eager 2 as follows succ_eager1 X Y var X gt var Y gt X Y suspend succ_eager1 X Y 0 X Y gt bound X is Y 1 Y is X 1 This gives us the desirable behaviour of failing as soon as possible succ_eager1 X Y X Y No 0 00s cpu Note that the built in predicate 2 is a similar case and uses the bound waking condition for the same re
207. it of the whole ECL PS session The execution of ECL PS may be suspended by typing CTRL Z suspend or by calling pause 0 This will suspend the ECL PS process and return the UNIX prompt Entering the shell command fg will return to ECL PS Note that this feature may not be available on all systems 3 5 7 Debugging a program Please see the chapters on debugging in the tutorial and user manuals for more details The tutorial chapter covers the TkECL PS debugging in a tutorial style tour and the user manual chapter covers debugging in general and the command line debugger in particular 14 3 5 8 The history mechanism The ECL PS toplevel loop provides a simple history mechanism which allows the examination and repetition of previous queries The history list is printed with the command h A previous query is invoked by typing either its absolute number or its relative negative offset from the current query number i e 1 will execute the previous query The current query number is displayed in the toplevel prompt The history is initialized from the file eclipse_history in the current directory or in the home directory This file contains the history goals each ended by a fullstop The current history can be written using the predicate write_history 0 from the util library 3 5 9 Getting help Detailed documentation about all the predicates in the ECL PS libraries can be obtained online through the help facility It has two modes
208. it will fail instead E g the head of the delay clause delay pla X if var X does not match the goal p A b but it matches the goal p a b e the delay clauses are deterministic they leave no choice points If one delay clause succeeds the call is delayed and the following delay clauses are not executed As soon as the call is resumed all delay clauses that may succeed are re executed The reason for using pattern matching instead of unification is to avoid a possible mixing of meta level control with the object level similarly to 3 The form of the head of a delay clause is not restricted For the body the following conditions hold e the body subgoals must not bind any variable in the call and they must not delay them selves The system does not verify these conditions currently e it should contain at least one of the following subgoals var 1 nonground 1 nonground 2 see nonground 3 2 If this is not the case then the predicate may delay without being linked to a variable so it delays forever and cannot be woken again Experience shows that the above four primitives suffice to express most usual conditions 168 More Examples e A predicate that checks if its argument is a proper list of integers The delay conditions specify that the predicate should delay if the list is not terminated or if it contains variable elements This makes sure that it will never generate list elements but only ac
209. ithin the queen directory reside index html queen 2 html and queen 2 txt lib document document ecl compiled traceable 83620 bytes in 0 04 seconds Yes 0 04s cpu icompile queen queen ecl compiled traceable 1432 bytes in 0 01 seconds examples queen eci generated in 0 00 seconds Yes 0 01s cpu eci_to_html queen Yes 0 00s cpu 15 4 Cross Referencing Tool The cross referencing library xref analyses an ECLiPSe source module or file and builds its predicate call graph The graph can either be returned in the format of lib graph_algorithms as text or as a graphical display The xref 2 predicate generates a call graph for the file File according to the Options list The options specify the format of the graph to be generated whether calls to built in predicates are displayed and whether it is a caller or callee graph xref xref queen 146 nodiag 3 calls nodiag 3 qdelete 4 calls qdelete 4 qperm 2 calls qdelete 4 qperm 2 queen 2 calls qperm 2 safe 1 safe 1 calls nodiag 3 safe 1 Yes 0 01s cpu xref xref queen builtins on output daVinci WARNING module daVinci does not exist loading library daVinci ecl compiled traceable 5644 bytes in 0 01 seconds The first xref predicate call generates a textual call graph for the queen module while the second generates the daVinci graph illustrated in figure 15 1 15 5 Pretty Print
210. ity specification of an operator e g fx yfx x represents an argument whose precedence must be lower than that of the operator y represents an argument whose precedence must be lower or equal to that of the operator y should be used if one wants to allow chaining of operators The position of the y will determine the grouping within a chain of operators For example Example declaration will allow to stand for op 500 xfx in A in B in A B op 500 xfy in A in B in C in A in B C op 500 yfx in A in B in C in in A B C op 500 fx pre pre A pre A op 500 fy pre pre pre A pre pre A op 500 xf post A post post A op 500 yf post A post post post post A op 500 fxx bin bin A B bin A B op 500 fxy bin bin A bin BC bin A bin B C 227 Operator declarations are usually local to a module but they can be exported and imported The operator visible in a module is either the local one if any an imported one or a predefined one Some operators are pre defined see Appendix B on page 231 They may be locally redefined if desired Note that parentheses are used to build expressions with precedence zero and thus to override operator declarations A 3 3 Operator Ambiguities Unlike the canonical syntax operator syntax can lead to ambiguities e For instance when a prefix operator is followed by an infix or postfix operator the prefix is often not meant to be a prefix operator but simply
211. l Tk replacing the TkECL PS top level but still using the development tools Chapter 3 gave an introduction to using TkECL PS from a user s point of view This chapter focuses on how to use the tools from a programmer s point of view i e how to include them in a program In particular it discusses in detail the display matrix tool which can be invoked in user s ECL PS code and also how to use the development tools in the user s own applications 4 1 Display Matrix This tool provides a method to display the values of terms in a matrix form It is particularly useful because it can display the attributes of an attributed variable The predicate which invokes the display matrix is considered a no op in the tty based ECL PS and so the same code can be run without modification from either eclipse or tkeclipse though the matrix display is only presented to the user in the latter This tool is invoked using either the make_display_matrix 2 predicate or the make_display_matrix 5 predicate Adding a call to one of these predicates should be the only change you need to make to your code For example in the following fragment of a N queens program only one extra line has been added to invoke a display matrix queens N List 1The display matrix tools is similar to the variable display of Grace The main differences are it can display all attributes not just the finite domain attribute the attributes can only be observed not
212. le eclipse 1 Emp employee name john age 30 salary 2000 address here arg name of employee Emp Name arg age of employee Emp Age arg salary of employee Emp Salary arg address of employee Emp Address arg p of employee Emp Person Emp employee person john here 30 2000 Name john Age 30 Salary 2000 Address here Person person john here 30 yes The indices of nested structures expand into lists of integers rather than simple integers e g age of employee expands into 1 3 5 1 5 Visibility Structure declaration can be local to a module when declared as above or exported when declared as export struct in the module 5 2 Loop Iterator Constructs Many types of simple iterations are inconvenient to write in the form of recursive predicates ECL PS therefore provides a logical iteration construct do 2 which can be understood either by itself or by its translation to an equivalent recursion A simple example is the traversal of a list main write_list 1 2 3 write_list write_list X Xs writeln X write_list Xs 29 which can be written as follows without the need for an auxiliary predicate main foreach X 1 2 3 do writeln X This looks very much like a loop in a procedural language However due to the relational nature of logic programming the same foreach construct can be used not only to control iteration over an existing
213. le 2 double X Y Y is 2 X trans_double double X Y Y Result not nonground X if X already known at compile time Result is 2 X do calculation at compile time All compiled calls to double 2 will now be preprocessed by being passed to trans_double 2 E g if we now compile the following predicate involving double 2 sample double 12 Y double Y Z the first call to double will be replaced by Y 24 while the second one will be unaffected The code that the compiler sees and compiles is therefore sample Y 24 double Y Z Note that meta calls e g via call 1 are never preprocessed they always go directly to the definition of double 2 Transformation can be disabled for debugging purposes by adding pragma noexpand to the compiled file or by setting the global flag set_flag goal_expansion off 47 6 8 Compiler Pragmas Compiler pragmas are compiler directives which instruct the compiler to emit a particular code type Their syntax is similar to directives pragma Option It is not possible to have several pragmas grouped together and separated by commas like goals every pragma must be specified separately Option can be one of the following e debug generate code which can be inspected with the debugger This overrides the global setting of the debug_compile flag e nodebug generate optimized code with no debugger support This overrides the global setting of
214. le in a different module use for instance get_flag p 3 visibility V othermodule 7 4 Less Common Topics 7 4 1 Modules Using Other Languages Modules created with the module 1 directive automatically import the module eclipse_language which provides the standard set of ECL PS built in predicates To create a module that uses a different language dialect use module 3 For instance 63 module mystdcode iso creates a module in which you can use ISO Standard Prolog but not all of ECL PS s usual language features Note that the third argument here iso simply specifies a library which implements the desired language so new languages can be added easily 7 4 2 Creating and Erasing Modules at Runtime A module can also be created explicitly by a running program with create_module 1 or cre ate_module 3 and erased with erase_module 1 The latter should be used with care erasing a module while a predicate defined in that module is being executed can provoke unpredictable results The same holds for trying to erase essential system modules 7 4 3 Initialization and Finalization Sometimes modules have global state which needs to be initialised or finalised For this purpose modules can have Local Initialization Goals these are specified as local initialization Goal and are executed just after the module containing them has been loaded Exported Initialization Goals these are specified as export initializ
215. le time optimizations 59 7 3 3 Reexport Making Modules from Modules To allow more flexibility in the design of module interfaces and to avoid duplication of defini tions it is possible to re export definitions A reexport is an import combined with an export That means that a reexported definition becomes visible inside the reexporting module and is at the same time exported again A user of a module s interface sees no difference between exported and reexported definitions There are 3 forms of the reexport 1 directive To reexport the complete module interface of another module use reexport amodule To reexport only an explicitly enumerated selection use reexport p 1 q 2 from amodule To reexport everything except some explicitly enumerated items use reexport amodule except p 2 q 3 These facilities make it possible to extend modify restrict or combine modules into new modules as illustrated in figure 7 1 Extend Restrict m2 interface m2 interface reexport export reexport except EC ee define m1 interface MOA ee ON m2 interface m3 interface reexport except export reexport reexport pee re define mi m2 interface interface Figure 7 1 Making modules from modules with reexport 7 3 4 Modules and Source Files When a source file contains no module directives it becomes
216. ler such as the do 2 iterator A warning is generated if a file contains more than one module These warnings often indicates that files have been incorrectly omitted or included in the include directive fcompile 1 2 can be used to generate non source versions of programs for delivery 6 10 1 Restrictions Currently the compiler generates the auxiliary predicates for the do iterator using a global counter to name the predicates Unfortunately this means that if an object file with auxiliary predicates is loaded into a module that already has existing code that contains auxiliary pred icates naming conflict can occur and the old auxiliaries may be replaced It is thus strongly recommended that object files should not be loaded into an existing module This will only be a problem if the file does not contain any module declarations that redefines the module i e module 1 as these redefinition will erase the old copy of the module The predicate generates the object code by first compiling the program and then outputting the object code Directives which are executed in a normal compilation process will not be 52 executed during the output of the object code but the directives themselves will be added to the object code so that they will be executed when the code is loaded This can lead to differences between loading the object code and compiling the program if the directive affects the compiled code during the compilation e g determini
217. les In ECL PS it is possible to compile this main file from any directory Note that if your program is large enough to warrant breaking into multiple files let alone multiple directories it is probably worth turning the constituent components into modules see chapter 7 15 3 7 How do I use ECL PS libraries in my programs A number of files containing library predicates are supplied with the ECL PS system These predicates provide utility functions for general use They are usually installed in an ECL PS library directory or directories These predicates are either loaded automatically by ECL PS or may be loaded by hand During the execution of an ECL PS program the system may dynamically load files containing library predicates When this happens the user is informed by a compilation or loading message It is possible to explicitly force this loading to occur by use of the lib 1 or use_module 1 predicates E g to load the library called lists use one of the following goals lib lists use_module library lists This will load the library file unless it has been already loaded In particular a program can ensure that a given library is loaded when it is compiled by including an appropriate directive in the source e g lib lists Library files are found by searching the library path and by appending a suffix to the library name The search path used when loading libraries is specified by the global flag li
218. library function to communicate between the host application and the ECL PS code However even in this set ting ECL PS can also handle signals directly provided the programmer sets up a corresponding interrupt handler 114 13 3 1 Interrupt Identifiers Interrupts are identified either by their signal number Unix or by a name which is derived from the name the signal has in the operating system Most built ins understand both identifiers It is usually more portable to use the symbolic name The built in current_interrupt 2 is provided to check and or generate the valid interrupt numbers and their mnemonic names 13 3 2 Asynchronous handling When an interrupt happens the ECL PS system calls an interrupt handling routine in a manner very similar to the case of event handling The only argument to the handler is the interrupt number Just as event handlers may be user defined so it is possible to define interrupt handlers The goal set_interrupt_handler N PredSpec assigns the procedure specified by PredSpec as the interrupt handler for the interrupt identified by N a number or a name Some interrupts cannot be caught by the user e g the kill signal trying to establish a handler for them yields an error message Note that PredSpec should be one of the predefined handlers The use of general user defined predicates is deprecated because of portability considerations To test interrupt handlers the built in kill 2 may be used
219. ls that can connect multiple processes on different ma chines in different networks The socket predicates are directly mapped to the system calls and therefore detailed information can be found in the Unix manuals Sockets in general allow a networked communication among many processes where each packet sent by one process can be sent to different address In order to limit the number of necessary built in predicates ECL PS supports only point to point communication based on stream or datagram sockets or many to one communication based on datagrams Broadcasting as well as using one socket to send data to different addresses is not supported except that datagram sockets can be re connected so that the same socket is directed to another address Below we describe the basic communication types that are available in ECL PS Note that the sockets streams in ECL PS are buffered like all other streams and so it is necessary to flush the buffer in order to actually send the data to the socket This can be done either with the flush 1 predicate or with the option b in printf 2 3 21 1 Socket Domains Currently there are two available domains unix and internet The communication in the unix domain is limited to a single machine running under an Unix operating system and the sockets are associated to files in this machine s file system The internet domain can be used to connect any two machines which are connected through the network It can al
220. meric variable The handler should therefore only be defined if the attribute contains that kind of information The handler call pattern is get_bounds_handler AttrVar Lwb Upb The handler is only invoked if the variable has the corresponding non empty attribute The handler should bind Lwb and Upb to numbers any numeric type reflecting the at tribute s information about lower and upper bound of the variable respectively If dif ferent attributes return different bounds information get_var_bounds 3 will return the narrowest ones e set_bounds This handler is used by the predicate set_var_bounds 3 to distribute infor mation about the lower and upper bound of a numeric variable to all its existing attributes The handler should therefore only be defined if the attribute can incorporate this kind of information The handler call pattern is set_bounds_handler AttrVar Lwb Upb The handler is only invoked if the variable has the corresponding non empty attribute Lwb and Upb are the numbers that were passed to set_var_bounds 3 and the handler is expected to update its own bounds representation accordingly e print attribute printing in write 1 2 writeln 1 2 printf 2 3 when the m option is specified The handler procedure is print_handler AttrVar Attribute Attr Var is the attributed variable being printed Attribute is the term which will be printed as a value for this attribute prefixed by the attribute name If
221. mory Areas Predicates Operators Event Event Type Default Event Handler 40 stale object handle error_handler 2 41 array or global variable does not exist undef_array_handler 3 42 redefining an existing array make_array_handler 4 43 multiple definition postfix infix error_handler 2 44 record already exists error_handler 2 45 record does not exist undef record_handler 2 50 trying to modify a read only ground term error_handler 2 60 referring to an undefined procedure error_handler 3 61 inconsistent tool redefinition error_handler 3 62 inconsistent procedure redefinition error_handler 3 63 procedure not dynamic error_handler 3 64 procedure already dynamic dynamic_handler 3 65 procedure already defined error_handler 3 66 trying to modify a system predicate error_handler 3 67 procedure is not yet loaded error_handler 3 68 calling an undefined procedure call_handler 4 69 autoload event autoload_handler 4 70 accessing an undefined dynamic procedure undef dynamic_handler 3 71 procedure already parallel error_handler 2 72 accessing an undefined operator error_handler 2 73 redefining an existing operator true 0 74 hiding an existing global operator true 0 75 referring to a deprecated predicate declaration_warning_handler 3 76 predicate declared but not defined declaration_warning_handler 3 77 predicate used but not declared or defined declaration_warning_handler 3 78 calling
222. mp sock yes eclipse 27 printf s w b message client read s Msg server eclipse 12 read news Msg printf news w b message server Msg message client yes client Msg message server yes 21 5 Datagram Connection unix domain This is similar to datagram connection in the internet domain except that it is limited to communications between two processes on the same Unix machine Again like in the internet domain the connection needs to be established in both directions if bi direction communication is required server Make a named socket and read two terms from it eclipse 10 socket unix datagram s bind s tmp sock yes eclipse 11 read s X read s Y process1 Connect a socket to the server and write one term eclipse 32 socket unix datagram s connect s tmp sock yes eclipse 33 printf s w b message process1 process2 Connect a named socket to the server and write another term eclipse 15 socket unix datagram s connect s tmp sock bind s tmp socka 215 yes eclipse 16 printf s w b message process2 yes And now disconnect the output socket from the server leclipse 17 connect s 0 yes server Now the server can read the two terms X message process1 Y message process2 yes and it writes one term to the second process on the same socket eclipse 12 co
223. n but at least one of them should do so If several specifiers impose termination conditions these conditions must coincide i e specify the same number of iterations Syntactically the do operator binds like the semicolon i e less than comma That means that the whole do construct should always be enclosed in parentheses see examples 31 Unless you use pragma noexpand or dbgcomp the do construct is compiled into an efficient auxiliary predicate named do_nnn where nnn is a unique integer This will be visible during debugging To make debugging easier it is possible to give the loop a user defined name by adding loop_name Name to the iteration specifiers Name must be an atom and is used as the name of the auxiliary predicate into which the loop is compiled instead of do_nnn The name should therefore not clash with other predicate names in the same module 5 2 1 Examples Iterate over list foreach X 1 2 3 do writeln X Maplist construct a new list from an existing list foreach X 1 2 3 foreach Y List do Y is X 3 Sumlist foreach X 1 2 3 fromto 0 In 0ut Sum do Out is In X Reverse list foreach X 1 2 3 fromto In Out Rev do Out X In or foreach X 1 2 3 fromto In X In Rev do true Iterate over integers from 1 up to 5 for I 1 5 do writeln I or count 1 1 5 do writeln I Iterate over integers from 5 down to 1 for 1 5 1 1 do writeln I Make list of integers
224. n dialog Select the file you wish to compile and click on the Open button This will compile the file and any others it depends on Messages indicating which files have been compiled and describing any errors encountered will be displayed in the bottom portion of the TkECL PS window Output and Error Messages If a file has been modified since it was compiled it may be recompiled by clicking on the make button This recompiles any files which have become out of date For more information on program compilation and the compiler please see chapter 6 3 4 2 Executing a query To execute a query first enter it into the Query Entry text field You will also need to specify which module the query should be run from by selecting the appropriate entry from the drop down list to the left of the Query Entry field Normally the default selection of eclipse will be fine this will allow access to all ECL PS built ins and all predicates that have not explicitly been compiled into a different module Selecting another module for the query is only needed if you wish to call a predicate which is not visible from the eclipse module in which case you 8 need to select that module For more information about the module system please see chapter 7 To actually execute the query either hit the Enter key while editing the query or click on the run button TkECL PS maintains a history of commands entered during the session and these may be recalled ei
225. n logical variable setting the variable giving it a value and referencing the variable finding the value currently associated with it The value of a non logical variable is set using the setval 2 predicate This has the format setval Name Value For instance the goal setval firm 3 gives the non logical variable firm the value 3 The value of a non logical variable is retrieved using the getval 2 predicate The goal getval firm X will unify X to the value of the non logical variable firm which has been previously set by setval 2 If no value has been previously set the call raises an exception If the value of a non logical variable is an integer the predicates incval 1 and decval 1 may be used to increment and decrement the value of the variable respectively The predicates incval 1 and decval 1 may be used e g in a failure driven loop to provide an incremental count across failures as in the example count_solutions Goal _ setval count 0 call Goal incval count fail count_solutions _ N getval count N However code like this should be used carefully Apart from being a non logical feature it also causes the code to be not reentrant Le if count_solutions 2 would be called recursively from inside Goal this would smash the counter and yield incorrect results The visibility of a non logical variable is local to the module where it is first set It is good style to declare them using local 1 va
226. n of the error handler is seen as replacing the invocation of the erroneous goal e If the error handler fails it has the same effect as if the erroneous goal failed e If the error handler succeeds possibly binding some variables the execution continues at the point behind the call of the erroneous goal e Ifthe handler calls exit_block 1 it has the same effect as if this was done by the erroneous goal itself For errors that are classified as warnings the second point is somewhat different If the handler succeeds the goal that raised the warning is allowed to continue execution Since implementing reliable timeouts is a nontrivial task we recommend the use of lib timeout for this purpose 111 Apart from binding variables in the erroneous goal error handlers can also leave backtrack points However if the error was raised by an external or a builtin that is implemented as an external these choicepoints are discarded 13 2 1 Error Handlers The predicate set_event_handler 2 is used to assign a procedure as an error handler The call set_event_handler Errorld PredSpec sets the event handler for error type ErrorId to the procedure specified by PredSpec which must be of the form Name Arity The corresponding predicate get_event_handler 3 may be used to identify the current handler for a particular error The call get_event_handler ErrorId PredSpec HomeModule will provided Errorid is a valid error identifier
227. n the most suitable argument of the predicate It is therefore not necessary to reorder the predicate arguments so that the first one is the crucial argument for indexing However the decision is still based only on one argument If it is necessary to look at two arguments in order to select the matching clause e g in p a a a p b a b pla b c p d b d p b c e and if it is crucial that this procedure is executed as fast as possible it is necessary to define an auxiliary procedure which can be indexed on the other argument p X a pa X p X b pb X p b c e pala a pa b b pb a c pb d d The standard approach is to index only on the first argument 49 The compiler also tries to use for indexing all type testing information that appears at the beginning of the clause body e Type testing predicates free 1 var 1 meta 1 atom 1 integer 1 rational 1 float 1 breal 1 real 1 number 1 string 1 atomic 1 compound 1 nonvar 1 and non ground 1 e Explicit unification and value testing 2 2 2 and 2 e Combinations of tests with 2 2 not 1 gt 2 e Arithmetic testing predicates lt 2 lt 2 gt 2 gt 2 if one argument is an integer constant and the other one known to be of the integer type e A cut after the type tests If the compiler can decide about the clause selection at compile time the type tests are never executed
228. n there is no space between sign and number the sign is taken as part of the number With space the sign is taken as prefix operator This is controlled by the syntax option blanks_after_sign A 5 Changing the Parser behaviour Some of these properties can be changed by choosing one of the following syntax_options The following options exist bar_is_no_atom disallow the use of an unquoted vertical bar as atom or functor and turns it into a synonym for a semicolon instead based_bignums Allow base notation even to write integers longer than the wordsize this implies they are always positive because the most significant bit is not interpreted as a sign bit blanks_after_sign ignore blank space between a sign and a number by default this space is significant and will lead to the sign being taken as prefix operator rather than the number s sign doubled_quote_is_quote parse a pair of quotes within a quoted item as one occurrence of the quote within the string If this option is off the default consecutive string quoted and list quoted items are parsed as a single concatenated item and consecutive quoted atoms are parsed as consecutive atoms iso_escapes ISO Prolog compatible escape sequences within strings and atoms iso_base_prefix allow binary octal or hexadecimal numbers to be written with Ob 0o or 0x prefix respectively and disallow the base number notation 229 limit_arg precedence do not allow terms with a prec
229. nd wake them after and so if a nondeterministic goal is woken it is committed by this cut which was most probably not intended On the other hand it is always possible to force waking before the cut by inserting a regular goal before it for example true 0 so the sequence true 182 can be viewed as a special cut type As a consequence the example can be fixed by inserting true at the beginning of the second clause However a preferable and more robust way is using the if then else construct which always forces waking suspended goals before executing the condition This would also be more efficient by avoiding the creation of a choice point filter _P 0 0 filter P N LI LL N mod P 0 gt LL NINLI filter P LI NLI filter P LI LL 17 11 2 Cuts and Suspended Goals The cut relies on a fixed order of goal execution in that it discards some choice points if all goals preceding it in the clause body have succeeded If some of these goals delay without being woken before the cut or if the head unification of the clause with the cut wakes any nondeterministic delayed goal the completeness of the resulting program is lost and there is no clean way to save it as long as the cut is used The user is strongly discouraged to use non local cuts together with coroutining or to be precisely aware of their scope The danger of a cut is twofold e Delaying out of the scope of a cut a cut can be executed after some calls
230. nded goal from the resolvent This predicate is meta logical as its use may change the semantics of the program 17 8 4 Examining the Resolvent The system keeps track of all created suspensions and it uses this data e g in the built in pred icates delayed_goals 1 suspensions 1 current_suspension 1 subcall 2 and to detect floundering of the query given to the ECL PS top level loop 177 17 8 5 Attaching Suspensions to Variables Suspensions are attached to variables by means of the attribute mechanism For this purpose a variable attribute needs to have one or more slots reserved for suspension lists Suspensions can then be inserted into one or several of those lists using insert_suspension Vars Susp Index Insert the suspension Susp into the Index th sus pension list of all attributed variables occurring in Vars The current module specifies which of the attributes will be taken insert_suspension Vars Susp Index Module Similar to insert_suspension 3 but it inserts the suspension into the attribute specified by Module For instance insert_suspension Vars Susp inst of suspend suspend inserts the suspension into the instlist of the system predefined suspend attribute of all variables that occur in Vars and insert_suspension Vars Susp max of fd fd would insert the suspension into the max list of the finite domain attribute of all variables in Vars Note that both predicates find all attributed variables wh
231. ng the Tracer option from the Tools menu The next time a goal is executed the tracer window will become active allowing you to step through the program s execution and examine the program s state as it executes The tracer displays the current call stack and a trace log By using the left mouse button in the Call Stack region of the tracer window you can bring up a menu of additional operations you can perform on that goal such as inspecting it or setting a spy point on the predicate in question Selecting Configure filter from the Options menu of the tracer will launch the conditional filter This filter allows you to specify conditions on which the tracer should stop at a debug port This can be very useful for skipping over unwanted debug ports For more information on using the tracer please see the online help available by selecting Tracer Help from the Help menu Other TkECL PS tools which are useful while using the tracer are e the predicate browser available by selecting the Predicate Browser option from the Tools menu which is useful for setting or removing spy points on predicates or for setting the start_tracing flag which activates the tracer when a particular predicate is called for the first time and e the term inspector available by double left clicking on a term from the stack window or by selecting the Inspector option from the Tools menu which is useful for examining and browse the arguments of a term in
232. ng to the current instantiations of its variables Arguments of the form represent subterm that are not printed due to the depth limit in effect The depth limit can be changed using the lt command The goal is printed with the current output_mode settings which can be changed using the o command 10 The prompt of the debugger which means that it is waiting for a command from the user Note there is no prompt when tkeclipse tracer is used 14 3 Debugging related Predicate Properties Predicates have a number of properties which can be listed using the pred 1 built in The following predicate flags and properties affect the way the predicate is traced by the debugger debugged Indicates whether the predicate has been compiled in debug compile mode If on calls to the predicate s subgoal will be traced The value of this property can only be changed by re compiling the predicate in a different mode leash If notrace no port of the predicate will be shown in the trace but the invocations will be counted nevertheless If stop the ports of this predicate will be shown and the debugger will stop and await new commands The print setting is currently not supported The value of this property can be changed with traceable 1 untraceable 1 or set_flag 3 spy If on the predicate has a spy point and the debugger will stop at its ports when in leap mode The value of this property can be changed with spy 1 nospy 1 or set_flag 3 sk
233. ng which files to load by a conditional in a directive If macro transformation is defined via macro 3 declarations in the module that is fcompiled then the protecting functor no_macro_expansion see section 12 2 should be used to prevent the macro definition itself from being transformed when the definition is generated by fcompile For example local macro no_marco_transformation foo 1 trans_foo 2 the no_macro_transformation 1 wrapper prevents this instance of foo 1 from being trans formed when the directive is generated by fcompile Note that this is only needed if all terms are transformed and not for goals or clause transformation Object file portability One restriction does apply between platforms of different word sizes integers which fit in the word size of one platform but not the other are represented differently internally in ECL PSS Specifically integers which takes between 32 and 64 bits to represent are treated as normal integers on a 64 bit machine but as bignums see section 8 2 1 on 32 bit machines This difference is normally invisible but if such numbers occur as constants in the program code i e their values appear textually they can lead to different low level compiled abstract code on the different platforms Avoid using such constants if you want the object code to be portable across different word sizes they can always be computed at run time e g writing 2734 instead of 17179869184 6
234. nnect s tmp socka printf s w b message server process2 eclipse 18 read s Msg Msg message server yes 216 Chapter 22 Porting Applications to ECL PS The ECL PS system is to a large extent compatible with Prolog systems of the Edinburgh family and one of the requirements during the development of ECL PS was to minimise the effort required to port programs written in other dialects to ECL PS However there are some differences When you want to run an existing Prolog application on the ECL PS system you have basically two choices Using a compatibility language dialect or modifying your program 22 1 Using the compatibility language dialect The ECL PS compatibility language dialects are the fastest way to get a program running that was originally written for a different system To use a particular language dialect a module should be created with that language dialect using module 3 The packages contain the neces sary code to make ECL PS emulate the behaviour of the other system to a large extent within the module Compatibility dialects exist for e ISO Standard Prolog module mymodulename iso e C Prolog module mymodulename cprolog e Quintus Prolog module mymodulename quintus e SICStus Prolog module mymodulename sicstus See the Reference Manual for details on the compatibility provided by the language dialects The language dialects are just modules which
235. no handler is specified for an attribute or the print handler fails the attribute will not be printed The following handlers are still supported for compatibility but their use is not recommened e pre_unify this is another handler which can be invoked on normal unification but it is called before the unification itself occurs The handler procedure is pre_unify_handler AttrVar Term The first argument is the attributed variable to be unfied the second argument is the term it is going to be unified with This handler is provided only for compatibility with SICStus Prolog and its use is not recommended because it is less efficient than the unify handler and because its semantics is somewhat unclear there may be cases where changes inside this handler may have unexpected effects 159 e delayed goals this handler is superseded by the suspensions handler which should be preferred If there is no suspensions handler this handler is invoked by the obsolete delayed_goals 2 predicate The handler procedure is delayed_goals_handler AttrVar GoalList GoalCont AttrVar is the attributed variable encountered in the term GoalList is an open ended list of all delayed goals in this attribute and GoalCont is the tail of this list 16 7 1 Printing Attributed Variables The different output predicates treat attributed variables differently The write 1 predicate prints the attributes using the print handlers while writeq 1 prints the
236. ntation of constraint propagation and similar data driven algorithms 17 2 Concepts 17 2 1 The Structured Resolvent The term resolvent originates from Logic Programming It is the set of all goals that need to be satisfied The computation typically starts with a resolvent consisting only of the top level goal the initial query This then gets successively transformed by substituting goals that match a clause head with an instance of the clause body ie a sequence of sub goals and eventually terminates with one of the trivial goals true or fail For example given the program Pp q r clause 1 q true clause 2 roi q clause 3 and the goal p the resolvent goes through the following states before the goal is proven by reduction to true and the computation terminates p 1 gt q r 2 gt true r gt r 3 gt q 2 gt true While in Prolog the resolvent is always processed from left to right like in this example the resolvent in ECL PS is more structured and can be manipulated in a much more flexible way This is achieved by two basic mechanisms suspension and priorities Suspended goals form the part of the resolvent which is currently not being considered This is typically done when we know that we cannot currently infer any interesting information from them 165 A ns aw Prio 1 Prio 2 9000 Prio 11 Prio 12 Suspended ae oe schedule Figure 17 1 Structure of the resolv
237. o integers numerator and denominator ECL PS represents rationals in a canonical form where the greatest common divisor of numerator and denominator is 1 and the denominator is positive Rational constants are written as numerator and denominator separated by an underscore e g 1_3 30517578125_32768 0_1 Rational arithmetic is arbitrarily precise When the global flag prefer_rationals is set the system uses rational arithmetic wherever possible In particular dividing two integers then yields a precise rational rather than a float result 8 2 3 Floating Point Numbers Floating point numbers conceptually correspond to the mathematical domain of real numbers but are not precisely represented Floats are written with decimal point and or an exponent e g 0 0 3 141592653589793 6 02e23 35e 12 1 0Inf ECL PS uses double precision floats 8 2 4 Bounded Real Numbers It is a well known problem that floating point arithmetic suffers from rounding errors To provide safe arithmetic over the real numbers ECL PS also implements bounded reals A bounded real consists of a pair of floating point numbers which constitute a safe lower and upper bound for the real number that is being represented Bounded reals are written as two floating point numbers separated by two underscores e g 1ECL PS versions older than 5 5 optionally supported single precision floats This is no longer the case 2We have chosen to use the term bounded r
238. o return to the current goal i e to the goal at whose port the execution is currently stopped 14 6 6 Inspecting Goals and Data This family of commands allow the subterms in the goal displayed at the port to be inspected The ability to inspect subterms is designed to help overcome two problems when examining a large goal with the normal display of the goal at a debug port 1 Some of the subterms may be omitted from the printed goal because of the print depth 2 If the user is interested in particular subterms it may be difficult to precisely locate them from the surrounding arguments even if it is printed In ECL PS 4 0 this was implemented as a submode invoked with two key strokes Hi It is now fully integrated into the debugger 128 With inspect subterm commands the user is able to issue commands to navigate through the subterms of the current goal and examine them A current subterm of the goal is maintained and this is printed after each inspect subterm command instead of the entire goal Initially the current subterm is set to the goal but this can then be moved to the subterms of the goal with navigation commands Once inspect subterm is initiated by an inspect subterm command the debugger enters into the inspect subterm mode This is indicated in the trace line by INSPECT instead of the name of the port and in addition the goal is not shown on the trace line INSPECT length 2 i gt Instead of showin
239. ocation number is assigned to the delayed goal and this number will be used in the matching RESUME port The DELAY port is caused by one of the built in predicates suspend 3 suspend 4 make_suspension 3 or a delay clause The port is displayed just after the delayed goal has been created RESUME When a waking condition causes the resuming of a delayed goal the procedure box is entered through its RESUME port The box then behaves as if it had been entered through its CALL port The invocation number is the same as in its previous DELAY port which makes it easy to identify corresponding delay and resume events However the depth level of the RESUME corresponds to the waking situation It is traced like a subgoal of the goal which has caused the waking In the rest of this chapter the user interface to the debugger is described including the commands available in the debugger itself as well as built in predicates which influence it Some of the debugger commands are explained using an excerpt of a debugger session In these examples the user input is always underlined it is in fact not always output as typed to distinguish it from the computer output 14 2 Format of the Tracing Messages All trace messages are output to the debug_output stream The format of one trace line is as follows S 4 2 EXIT lt 5 gt module foo one X two gt 123 456 7 8 9 10 1 The first character shows some properties of the displayed procedure It may be
240. ociated priority The priority of the currently executing goal can be determined with get_priority 1 Priority based execution is driven by a scheduler It picks up the scheduled suspension with the highest priority If its priority is higher than the priority of the currently executing goal then the execution of the current goal is interrupted and the new suspension is executed This is repeated until there are no suspensions with priority higher than that of the current goal 17 10 1 Changing Priority Explicitly It is also possible to execute a goal with a given priority by means of call_priority Goal Prio which calls Goal with the priority Prio When a goal is called this way with high priority it is effectively made atomic ie it will not be interrupted by goals with lower priority that wake up while it executes Those goals will all be deferred until exit from call_priority 2 This technique can sometimes improve efficiency Consider for example the following program p 1 report Term writeln term Term suspend report Term 3 Term gt inst 180 and the execution eclipse 2 report f X Y Z p X p Y p Z term f X Y Z term f 1 Y Z term f 1 1 Z term f 1 1 1 report 1 is woken and executed three times once for each variable binding If instead we do the three bindings under high priority it will only execute once after all bindings have already been done eclipse 3 report f X Y Z call
241. ode is TQPm 4 10000000 INSPECT list 1 head 2 tail gt up subterm A 4 10000000 INSPECT attributes 1 suspend 2 fd A gt 2 fd dom 4 10000000 9999997 1 1 1 INSPECT struct fd 4 gt lt o gt current output mode is QPmT toggle char T new output mode is QPm fa 4 10000000 0 0 0O xxkkk printed structure 2 INSPECT struct fd 4 gt Printed structures 1 and 2 in the above example are at the same position toplevel of the finite domain structure and printed with the same output mode QPm but are different because the structure obtained from the parent subterm is different in printed structure 2 the output mode was not changed until after the d 4 structure was the current subterm 14 6 7 Changing the Settings The following commands allow to change the parameters which influence the way the tracing information is displayed or processed lt par set print depth Allows to modify the print_depth i e the depth up to which nested argument terms are printed Everything nested deeper than the specified depth is abbreviated as Note 137 that the debugger has a private print_depth setting with default 5 which is different from the global setting obtained from get_flag 2 gt par set indentation step width Allows to specify the number of spaces used to indent trace lines according to their depth level The default is 0 module Toggles the module printing in the trace line If enabl
242. ode relies on such behaviour it is best to modify it by adding an explicit check like compound T arg N T X Another alternative is to redefine the arg 3 builtin using 2 to access the original version local arg 3 arg N T X compound X eclipse_language arg N T X A third alternative is to define an error handler which will fail the predicate whenever the event is raised In this case my_type_error _ arg _ gt _ fail my_type_error E Goal error default E Goal set_error_handler 5 my_type_error 2 218 As the ECL PS compiler does not accept procedures whose clauses are not consecutive in a file you have to load the library scattered pl if you want to compile such procedures 22 3 Exploiting ECL PS Features When rewriting existing applications as well as when writing new programs it is useful to bear in mind important ECL PS features which can make programs easier to write and or faster The maximum performance is obtained when calling nodbgcomp 0 at the beginning of the session before compiling any program and loading any libraries ECL PS arrays and global variables setval 2 getval 2 are usually more suitable to store permanent data than assert 1 is and are usually faster ECL PS has a number of language extensions which make programming easier see chapter 5 The predicates get_flag 2 get_flag 3 get_file info 3 get_stream_info 3 get_var_in fo 3 give a lot
243. odule In ECL PS such predicates that need to know their caller module are called tool predicates Tool predicates must be declared As a consequence the system will automatically add a caller module argument whenever such a tool predicate is called Consider for example a predicate that calls another predicate twice The naive version of this predicate looks like twice Goal call Goal call Goal As long as no modules are involved this works fine Now consider the situation where the definition of twice 1 and a call of twice 1 are in two different modules module stuff export twice 1 twice Goal call Goal call Goal module main import stuff top twice hello hello writeln hi 3Many Prolog systems call them meta predicates 61 This will not work because hello 0 is only visible in module main and an attempt to call it from within twice 1 in module stuff will raise an error The solution is to declare twice 1 as a tool and change the code as follows module stuff export twice 1 tool twice 1 twice 2 twice Goal Module call Goal Module call Goal Module What happens now is that the call to twice 1 in module main twice hello is effectively replaced by the system with a call to twice 2 where the additional argument is the module in which the call occurs twice hello main This caller module is then used by twice 2 to execute
244. odule name is the library name and same as the base part of the library filename e the application defined modules these are created by the application programmer e in an interactive ECL PS toplevel there is one module in which queries entered by the user are read and executed That module name is displayed in a prompt 7 2 Getting Started 7 2 1 Creating a Module You create a module simply by starting your program code with a module 1 directive This should usually be placed at the beginning of the source file and looks like module mymodule As a rule the module name should be chosen to be the same as the file s base name the filename without directory folder and suffix extension part E g the module mymodule might be contained in a file mymodule ecl Anything you define in your module is by default local to that module 7 2 2 Exporting A definition is made available to the outside world by exporting it All the exports of a module together form the module s interface Exporting is done with the export 1 directive which can take different forms depending on the kind of the exported item Predicates are exported as follows 56 export p 2 p X Y Structures are exported by defining them with an export 1 instead of a local 1 directive e g export struct book author title publisher And the same holds for operators and other syntax settings export op 500 xfx before export chtab 0
245. of information is monitored Prio is the priority that the demon should be suspended at Type is designed to specify the attributes that is being monitored currently all attributes are monitored and Type is a dummy argument CondList is the suspension list that the demon should be added to Depending on these arguments the level of monitoring can be controlled Note that it is possible for the display matrix to show values that are out of date because the change was not monitored The display matrix will be removed on backtracking However it will not be removed if make_display_matrix has been cut kill_display_matrix 1 can be used to explicitly remove the matrix in this case kill display_matrix Name This predicate destroys an existing display matrix Name is an atomic term which identifies the matrix Destroys an existing display matrix The display matrix is removed from being displayed 4 1 1 Invoking display matrix tool interactively Display matricies can be created interactively when a program is executing if the program is being debugged with the tracer tool The user can select terms that are to be observed by a display matrix while at a debug port This can be done from the inspector the tracer and the delay goal tools See the online help files available from the help menu of TkKECL PS for more details 4 2 Using the development tools in applications The user can develop their own ECL PS applications using the develo
246. of this predicate To see the starting predicate itself set a spy point in addition to the start_tracing flag eclipse 1 debugging Debugger is switched off yes eclipse 2 set_flag buggy_goal 0 start_tracing on set_flag buggy_goal 0 spy on yes eclipse 3 big_goal1 buggy_goal big_goal2 0 O CALL buggy_goal gt creep 0 O EXIT buggy_goal gt creep yes In tkeclipse the debugger can also be started in this way The tracer tool will popup at the appropriate predicate if it has not been invoked already The start_tracing flag can also be set with the predicate browser tool 14 6 Using the Debugger via the Command Line Interface This section describe the commands available at the debugger prompt in the debugger s com mand line interface for the graphical user interface please refer to the online documentation Commands are entered by typing the corresponding key without newline the case of the letters is significant The action of some of them is immediate others require additional parameters to be typed afterwards Since the ECL PS debugger has the possibility to display not only the goal that is currently being executed the current goal or procedure but also its ancestors some of the commands may work on the displayed procedure whatever it is and others on the current one 14 6 1 Counters and Command Arguments Some debugger commands accept a counter a small integer number before the comm
247. of useful information about the system and the data The ECL PS macros often help to solve syntactic problems see chapter 12 The TkECL PS GUI provides many features that should make developing programs easier than with the traditional tty interface It is worth familiarising oneself with the debugger s features see chapter 14 ECL PS is highly customizable even problems which seemingly require modification of the ECL PS sources can very often be solved at the Prolog level 219 220 Appendix A Syntax A 1 Introduction This chapter provides a definition of the syntax of the ECL PS Prolog language A complete specification of the syntax is provided and comparison to other commercial Prolog systems are made The ECL PS syntax is based on that of Edinburgh Prolog 1 A 2 Notation The following notation is used in the syntax specification in this chapter e a term_h is a term which is the head of the clause e a term_h N is a term_h of maximum precedence N e a term_g is a term which is a goal body of the clause e a term_g N is a term_g of maximum precedence N e a term_a is a term which is an argument of a compound term or a list e a term N can be any term term_h term_a or term_h of maximum precedence N e fx N is a prefix operator of precedence N which is not right associative e fy N is a prefix operator of precedence N which is right associative similar definitions apply for infix xfx xfy yfx and po
248. og language In particular it allows the system s behaviour on unification to be customised In most situations an attributed variable behaves like a normal variable E g it can be unified with other terms and var 1 succeeds on it The differences compared to a plain variable are e an attributed variable has a number of associated attributes e the attributes are included in the module system e when an attributed variable occurs in the unification and in some built in predicates each attribute is processed by a user defined handler 16 2 Declaration An attributed variable can have any number of attributes The attributes are accessed by their name Before an attribute can be created and used it must be declared with the predicate meta_attribute 2 The declaration has the format meta_attribute Name HandlerList Name is an atom denoting the attribute name and usually it is the name of the module where this attribute is being created and used HandlerList is a possibly empty list of handler specifications for this attribute see Section 16 7 155 16 3 Syntax The most general attributed variable syntax is Var Name Attr Names Attra Name Attr where the syntax of Var is like that of a variable Name are attribute names and Attr are the values of the corresponding attributes The expression Var Attr is a shorthand for Var Module Attr where Module is the current module name The former is called unqual ifie
249. ometimes used differently See Appendix C for details 113 my_error_repair_handler ErrorId Goal ContextModule LookupModule repair the error some code to repair the cause for the error try call the erroneous goal again LookupModule Goal ContextModule 13 2 3 User Defined Errors The following example illustrates the use of a user defined error We declare a handler for the event Invalid command and raise the new error in the application code Command error handler output invalid command sound bell and abort command_error_handler _ Command printf 007 nInvalid command w n Command abort Activate the handler set_event_handler Invalid command command_error_handler 2 top command processing loop go writeln Enter command read Command valid_command Command gt process_command Command go error Invalid command Command Y Call the error handler Some valid commands valid_command start valid_command stop 13 3 Interrupts Operating systems such as Unix provide a notion of asynchronous interrupts or signals In a standalone ECL PS system the signals can be handled by defining interrupt handlers for them In fact a set of default handlers is already predefined in this case In an embedded ECL PS signals are usually handled by the host application and it is recom mended to use the event mechanism described above the ec_post_event
250. ompile time and so if a simple predicate would cause the invocation of a non deterministic error handler the generated code may no longer be correct 112 which returns on backtracking all the errors whose error message contains the string Text The ability to define any Prolog predicate as the error handler permits a great deal of flexibility in error handling However this flexibility should be used with caution The action of an error handler could have side effects altering the correctness of a program indeed it could be responsible for further errors being introduced One particular area of danger is in the use of input and output streams by error handlers 13 2 2 Arguments of Error Handlers An error handler has 4 optional arguments 1 The first argument is the number or atom that identifies the error 2 The second argument is the culprit a structure corresponding to the call which caused the error For instance if say a type error occurs upon calling the second goal of the procedure p 2 Z p X Y a b X Y c M the structure given to the error handler is b 2 Y Note that the handler could bind Y which would have the same effect as if b 2 had done the binding 3 The third argument is only defined for a subset of the existing errors If the error oc curred inside a tool body it holds the caller module otherwise it is identical to the fourth argument 4 The fourth argument is the lookup module for the culprit
251. on Event Event Type Default Event Handler 130 syntax error illegal head compiler_error_handler 2 131 syntax error illegal goal compiler_error_handler 2 132 syntax error term of an unknown type compiler_error_handler 2 133 loading the library true 0 134 procedure clauses are not consecutive compiler_error_handler 2 135 trying to redefine a protected procedure compiler_error_handler 2 136 trying to redefine a built in predicate compiler_error_handler 2 137 trying to redefine a procedure with another type compiler_error_handler 2 138 singleton local variable in do loop singleton_in_loop 2 139 compiled or dumped file message compiled_file_handler 3 140 undefined instruction error_handler 2 141 unimplemented functionality error_handler 2 142 built in predicate not available on this system error_handler 2 143 compiled query failed compiler_error_handler 2 144 a cut is not allowed in a condition compiler_error_handler 2 145 procedure being redefined in another file redef_other_file_handler 2 146 start of compilation true 0 147 compilation aborted compiler_abort_handler 3 148 bad pragma compiler_error_handler 2 149 code unit loaded unit_loaded_handler 3 The handlers for these events receive the following arguments Event Second Argument Third Argument 130 Culprit clause Module 131 Culprit clause Module 132 Culprit clause Module 133 Library name string undefined 134 Procedure Name Arity
252. on see section 5 1 should be used to define the structures e Tests are generally rather slow unless they can be compiled away see indexing e When processing all arguments of a structure using 2 and list predicates is always faster more readable and easier analyzable by automated tools than using functor 3 and arg 3 loops e Similarly when adding one new element to a structure using 2 and append 3 is faster than functor arg e Waking is less expensive than metacalling and more expensive than direct calling Meta calls although generally slow are still a lot faster than in some other Prolog systems e Sorting using sort 2 is very efficient and it does not use much space Using setof 3 findall 3 etc is also efficient enough to be used every time a list of all solutions is needed e using not not Goal is optimised in the compiler to use only one choice point e 2 when expanded by the compiler is faster than 2 or 2 e 2 is optimised away by the compiler if both argument are known e Using several clauses is much more efficient than using a disjunction if the clause heads contain nonvariables which can be used for indexing If no indexing can be made anyway using a disjunction is slightly faster e Conditionals with gt are compiled more efficiently if the condition is a simple built in test However using several clauses can be faster if the compiler optimises the test away 6 10 Compiling and loadin
253. on Windows When profile Goal is called the profiler executes the Goal in the profiling mode which means that every 100th of a second the execution is interrupted and the profiler records the currently executing procedure Issuing the following query will result in the profiler recording the currently executing goal 100 times a second profile queen 1 2 3 4 5 6 7 8 9 Out goal succeeded PROFILING STATISTICS Goal queen 1 2 3 4 5 6 7 8 9 Out Total user time 0 03s Predicate Module Time Time Cum qdelete 4 eclipse 50 0 0 01s 50 0 nodiag 3 eclipse 50 0 0 01s 100 0 Out 1 3 6 8 2 4 9 7 5 148 Yes 0 14s cpu From the above result we can see how the profiler output contains four important areas of information 1 The first line of output indicates whether the specified goal succeeded failed or aborted The profile 1 predicate itself always succeeds 2 The line beginning Goal shows the goal which was profiled 3 The next line shows the time spent executing the goal 4 Finally the predicates which were being executed when the profiler sampled ranked in decreasing sample count order are shown Auxiliary system predicates are printed under a common name without arity e g arithmetic or all_solutions Predicates which are local to locked modules are printed together on a single line that contains only the module name By default only predicates written in Prolog are profiled i e
254. one of e C an external procedure not implemented in Prolog e S a skipped procedure i e a procedure whose subgoals are not traced 119 A displayed here shows that the procedure has a spy point set The number between parentheses shows the box invocation number of this procedure call Since each box has a unique invocation number it can be used to identify ports that belong to the same box It also shows how many procedure redos have been made since the beginning of the query Only boxes that can be traced obtain an invocation number for instance subgoals of a procedure which is compiled in debug mode or has its skip flag set are not numbered When a delayed goal is resumed it keeps the invocation number it was assigned when it delayed This makes it easy to follow all ports of a specified call even in data driven computation The second number shows the level or depth of the goal i e the number of its ancestor boxes When a subgoal is called the level increases and after exit it decreases again The initial level is 1 Since a resumed goal is considered to be a descendant of the procedure that woke it the level of a resumed goal may be different from the level the goal had when it delayed An asterisk before an EXIT means that this procedure is nondeterministic and that it might be resatisfied The next word is the name of the port It might be missing if the displayed goal is not the current position in the
255. or which assert 1 2 is called are silently declared as dynamic by the event handler and so no declaration is needed When compiling static procedures the compiler remembers their position in the file which can be then queried by get_flag 3 The library scattered actually uses this feature to retrieve predicates whose clauses are not consecutive 6 3 Compiler Modes The compiler has several modes of operation each mode generating code with different proper ties The operating mode is controlled by a set of global flags which may be modified at any time even during the compilation so that a part of the program is compiled in a different mode These flags and the associated modes are listed below debug_compile When this flag is on the compiler generates code which can be traced with the debugger To generate optimised untraceable code this flag must be switched off This can also be achieved by the use of nodebug compiler pragma in the program pragma nodebug occur_check When this flag is on the compiled code will perform the occur check if necessary This means that every time a variable will be unified with a compound term that might already contain a reference to this variable the compound term will be scanned for this occurrence and if it is found the unification fails In this way the creation of infinite cyclic terms is impossible and thus the behaviour of the system is closer to the first order logic theory Unification
256. orm as Body and is also called a goal Such clauses occur mainly as input to the top level Prolog loop and in files being compiled then they have the form Goal_1 Goal_k or Goal_1 Goal_k Regular Prolog Procedure A regular Prolog procedure is a sequence of user clauses whose heads have the same functor which then identifies the user procedure Simple Procedures Apart from regular procedures ECL PS recognises simple procedures which are written not in Prolog but in the implementation language i e C and which are deterministic There is a functor associated with each simple procedure so that any procedure recognisable by ECL PS is identified by a functor or a compound term with this functor or atom SpecList The SpecList notation means a sequence of terms of the form name_1 a_1 name_2 a_2 name_k a_k The SpecList notation is used in many built ins for example to specify a list of procedures in the export 1 predicate Static Procedures These are procedures which can only be changed as a whole unit i e removed or replaced Stream This is an I O channel identifier and can be a physical stream number one of the pre defined stream identifiers input output error warning_output log_output null or a user defined stream name defined using set_stream 2 or open 3 Structures Compound terms which are not pairs are also called structures Term A term is the basic data type in Prolog It is either a v
257. ort circuit technique Each suspension will include two additional variables the first one being shared with the previous suspension and the second one with the next suspension All suspensions are thus chained with these variables The first variable of the first suspension is instantiated at the beginning When a suspension is woken and it finds out that its pair of matched terms became identical it binds those additional variables to each other When all suspensions are woken and their pairs become identical the second variable of the last suspension becomes instantiated and this can be used for notification that the predicate has failed dif3 T1 T2 Yes No compare_args T1 T2 no No Yes compare_args _ _ _ _ Yes nonvar Yes compare_args A1 A2 Link NewLink Yes var Yes A1 A2 gt Link NewLink short cut the links var A1 var A2 gt suspend compare_args A1 A2 Link NewLink Yes 3 A1 A2 gt bound Yes gt inst compare_terms A1 A2 Link NewLink Yes compare_terms T1 T2 Link NewLink Yes T F1 Args1 T2 F2 Args2 F1 F2 gt compare_lists Args1 Args2 Link NewLink Yes Yes yes compare_lists L L _ compare_lists X1 A1 X2 A2 Link NewLink Yes compare_args X1 X2 Link L1 Yes compare_lists A1 A2 L1 NewLink Yes The variable Yes is instantiated as soon as the constraint becomes true This will also wake all pending s
258. p RESUME X 2 9 Z 2 8 gt 1 gt scheduled goals with prio all 3 2 RESUME X 2 9 Z 2 8 gt 1 gt G all ancestors Prints all the current goal s ancestors from the oldest to the newest The display format is similar to trace lines except that is displayed in the port field print definition If given at a trace line the command displays the source code of the current predicate If the predicate is not written in Prolog or has not been compiled from a file or the source file is inaccessible no information can be displayed h help Print a summary of the debugger commands 7 help Identical to the h command 14 6 5 Navigating among Goals While the debugger waits for commands program execution is always stopped at some port of some predicate invocation box or goal Apart from this current goal two types of other goals are also active These are the ancestors of the current goal the enclosing not yet exited boxes in the box model and the delayed goals The debugger allows to navigate among these goals and inspect them g ancestor Move to and display the ancestor goal or parent of the displayed goal Repeated appli cation of this command allows to go up the call stack x par examine goal Move to and display the goal with the specified invocation number This must be one of the active goals i e either an ancestor of the current goal or one of the currently delayed goals The default is t
259. part of the module from which its compilation was invoked This makes it possible to write small programs without caring about modules However serious applications should be structured into modules except that reexported predicates retain their original definition module 60 Often it is the most appropriate to have one file per module and to have the file name match the module name It is however possible to have several modules in one file e g a main module and one or more auxiliary modules in that case the name of the main module should match the filename Every module directive in the file marks the end of the previous module and the start of the next one It is also possible to spread the contents of a module over several files In this case there should be a main file whose filename matches the module name and the other files should be referenced from the main file using the include 1 directive e g module bigmodule include part1 include part2 7 3 5 Tools and Caller Modules Tools There are predicates in a modular system that need to know from which module they were called since this may be different from the module in which they were defined The most common case is where a predicate is a meta predicate i e a predicate that has another goal or predicate name as an argument Other cases are I O predicates they need to be executed in a certain module context in order to obey the correct syntax of this m
260. pe Default Event Handler 110 syntax error parser_error_handler 2 111 syntax error list tail ended improperly parser_error_handler 2 112 syntax error illegal character in a quoted token parser_error_handler 2 113 syntax error precedence too high parser_error_handler 2 114 syntax error unexpected token parser_error_handler 2 115 syntax error unexpected end of file parser_error_handler 2 116 syntax error numeric constant out of range parser_error_handler 2 117 syntax error bracket necessary parser_error_handler 2 118 syntax error unexpected fullstop parser_error_handler 2 119 syntax error postfix infix operator expected parser_error_handler 2 120 syntax error wrong solo char parser_error_handler 2 121 syntax error space between functor and open parser_error_handler 2 bracket 122 syntax error variable with multiple attributes parser_error_handler 2 123 illegal iteration specifier in do loop error_handler 3 124 syntax error prefix operator followed by infix parser_error_handler 2 operator 125 syntax error unexpected closing bracket parser_error_handler 2 126 syntax error grammar rule head is not valid parser_error_handler 2 127 syntax error grammar rule body is not valid parser_error_handler 2 128 syntax error in source transformation parser_error_handler 2 129 syntax error source transformation floundered parser_error_handler 2 236 C 1 6 Compilation Run Time System Executi
261. pecify both the host name and the port number server eclipse 10 socket internet stream s bind s X X acrab5 3789 yes eclipse 11 listen s 1 accept s From news lt blocks waiting for a connection gt client eclipse 26 socket internet stream s connect s acrab5 3789 yes eclipse 27 printf s w b message client read s Msg server From acrab4 1627 yes eclipse 12 read news Msg printf news w b message server Msg message client yes client Msg message server yes 21 3 Datagram Connection internet domain This type of communication is the most general one offered by ECL PS It is based on packets sent from one process to another perhaps across a network Any machine which is reachable over the network can participate in the communication The communication protocol does not guarantee that the message will always be delivered but normally it will be Every packet represents a message which is read separately at the system level however at the Prolog level the packet boundaries are not visible The difference to stream communication is that there is no obligatory connection between the server and the client First the socket has to be created and then the process which wants to read from the it The packet boundaries are not of much interest in Prolog because every Prolog term represents itself a message with clear boundaries 210 binds t
262. pension with id invocation number 123 It is possible to change the way suspensions are printed by defining a portray 3 transformation for the term type goal 17 8 3 Operations on Suspensions The following summarises the predicates that can be used to create test decompose and destroy suspensions make_suspension Goal Priority Susp make_suspension Goal Priority Susp Module Create a suspension Susp with a given priority from a given goal The goal will subsequently show up as a delayed goal is_suspension Susp Succeeds if Susp is a sleeping or scheduled suspension fails if it is not a suspension or a suspension that has been already executed type_of S goal Succeeds if S is a suspension no matter if it is sleeping scheduled or executed get_suspension_data Susp Name Value Extract any of the information contained in the suspension Name can be one of goal module priority state or invoc debugger invocation number set_suspension_data Susp Name Value The priority and invoc debugger invocation number fields of a suspension can be changed using this primitive If the priority of a sleeping suspension is changed this will only have an effect at the time the suspension gets scheduled If the suspension is already scheduled changing priority has no effect except for future schedulings of demons see 17 9 kill suspension Susp Convert the suspension Susp into an executed one ie remove the sus pe
263. pment tools independent of the TkECL PS toplevel There are two ways to do this depending on if the user is also using the embedding Tcl Tk interface see the Embedding and Interfacing Manual to provide a graphical front end e The user is using the embedding Tcl Tk interface and is thus developing a graphical front end in Tk In this case the user can use the development tools via the embedding interface This is described in section 4 2 1 e The user is not using the embedding Tcl Tk interface In this case the user can use the development tools remotely by using the remote_tools library This is described in section 4 2 2 4 2 1 Using the Development tools in the Tcl Tk Embedding Interface The development tool suite was designed to be independent of the TkECL PS top level so that they can be used in a user s application In effect the user can replace the TkECL PS top level 21 with their own alternative top level Two simple examples in which this is done are provided in the lib_tcl library as example tcl and example1 tcl In addition tkeclipse itself in the file tkeclipse pl can be seen as a more complex example usage of the interface In order to use the Tcl Tk interface the system must be initialised as described in the Embedding manual In addition the user s Tcl code should probably also be provided as a package using Tcl s package facility in order to allow the program to run in a different directory See the Embedd
264. ponds to an implicit recursive call in the body of each demon clause Or in other words the demon goal forks into one goal that remains in the suspended part of the resolvent and an identical one that gets scheduled for execution With this functionality our above example can be done more efficiently One complication arises however Since the goal implicitly re suspends it now has to be explicitly killed when it is no longer needed The easiest way to achieve this is to let it remember its own suspension in one of its arguments This can then be used to kill the suspension when required A demon that wakes whenever X becomes more constrained report X suspend report X Susp 1 X gt constrained Susp demon report 2 report X _Susp var X gt writeln constrained X implicitly re suspend writeln instantiated X kill_suspension Susp remove from the resolvent 17 10 More about Priorities For the scheduled goals ECL PS uses an execution model which is based on goal priorities and which guarantees that a scheduled goal with a higher priority will be always executed before any goal with lower priority Priority is a small integer number ranging from 1 to 12 1 being the highest priority and 12 the lowest cf figure 17 1 All goals started from the ECL PS top level loop or from the command line with the e option have priority 12 Each suspension and each goal which is being executed therefore has an ass
265. position in the file the file pointer to the offset Pointer a number specifying the length in bytes from the start of the file If Pointer is the atom end_of_file the current position is moved to the end of the file Hence a file could be open in append mode using open File update Stream seek Stream end_of_file The current position in a file may be found by the predicate at 2 The call at Stream Pointer 89 unifies Pointer with the current position in the file The predicate at_eof Stream succeeds if the current position in the given stream is at the file end 10 3 In memory Streams There are two kinds of in memory streams string streams and queues String streams be have much like files they can be read written positioned etc but they are implemented as buffer in memory Queues are intended mainly for message passing style communication be tween ECL PS and a host language and they are also implemented as memory buffers 10 3 1 String Streams In ECL PS it is possible to associate a stream with a Prolog string in its memory and this string is then used in the same way as a file for the input and output operations A string stream is opened like a file by the open 3 predicate call open string InitString Mode Stream where InitString can be a ECL PS string or a variable and represents the initial contents of the string stream If a variable is supplied for InitString the initial value of the string s
266. pound terms it is also possible to navigate into the attributes of at tributed variables 129 eclipse 21 suspend foo X 3 X gt inst foo X lt NL gt 1 1 DELAY foo X gt lt NL gt creep 2 1 CALL foo X gt 1 lt NL gt X INSPECT attributes 1 suspend 2 fd 7 gt 1 lt NL gt suspend SUSP 1 susp _218 _218 1 INSPECT struct suspend 3 gt The variable X is an attributed variable in this case and when it is the current subterm this is indicated in the trace line The debugger also shows the user the currently available attributes and the user can then select one to navigate into fd is available in this case because the finite domain library was loaded earlier in the session Otherwise it would not be available as a choice here Note that the suspend 3 summary contains a struct before it This is because the suspend 3 is a predefined structure with field names see section 5 1 It is possible to view the field names of such structures using the command in inspect mode If the number specified is larger than the number of the arguments of the current subterm then an error is reported and no movement is made foo a g b 1 2 3 INSPECT fo0 3 gt 4 lt NL gt Out of range foota g b 1 2 3 INSPECT foo 3 gt nuparrow key Move current subterm up by N levels nA Move current subterm up by N levels In addition to moving the current subterm down it can also be moved
267. preceding it in the clause or children of these calls delay When they are then woken later they may cause the whole execution to fail instead of just the guard before the cut e Delaying into the scope of a cut the head unification of a clause with cuts can wake delayed goals If they are nondeterministic the cut in the body of the waking clause will commit even the woken goals 17 12 Simulating other System s Delay Primitives It is relatively easy to simulate similar constructs from other systems by using delay clauses for example MU Prolog s sound negation predicate 1 can be in ECL PS simply implemented as delay X if nonground X X t X MU Prolog s wait declarations can be in most cases simulated using delay clauses Although it is not possible to convert all wait declarations to delay clauses in the real life examples this can usually be achieved The block declarations of SICStus Prolog can be easily expressed as delay clauses with var 1 and nonground 1 conditions The freeze 2 predicate e g from SICStus Prolog same as geler 2 in Prolog II can be expressed as delay freeze X _ if var X freeze _ Goal call Goal 183 The transcription of when declarations from NU_Prolog basically involves negating them for instance the when declarations flatten _ when ever flatten A _ _ when A can be rewritten as delay flatten A _ if var A delay flatten Al_ _ if var A Note
268. provides the necessary code and exports to emulate a particular Prolog dialect This module is imported instead of the default eclipse_language dialect which provides the ECL PS language The source code of the language dialect module is provided in the ECL PS library directory Using this as a guideline it should be easy to write similar packages for other systems as long as their syntax does not deviate too much from the Edinburgh tradition The following problems can occur despite the use of compatibility packages 22 1 1 Compiler versus Interpreter If your program was written for an interpreter e g C Prolog you have to be aware that ECL PS is a compiling system There is a distinction between static and dynamic predicates By default a predicate is static This means that its clauses have to be be compiled as a whole they must 217 not be spread over multiple files its source code is not stored in the system and it can not be modified only recompiled as a whole In contrast a dynamic predicate may be modified by compiling or asserting new clauses and by retracting clauses lts source code can be accessed using clause 1 2 or listing 0 1 A predicate is dynamic when it is explicitly declared as such or when it was created using assert 1 Porting programs from an interpreter usually requires the addition of some dynamic declarations In the worst case when almost all procedures have to be dynamic the flag all dynamic can be set
269. py point Similarly to the previous command this one removes a spy point from a procedure if it has one 14 6 8 Environment Commands break This command is identical to the break 0 call A new top level loop is started with the debugger switched off The state of the database and the global settings is the same as 138 in the previous top level loop After exiting the break level with D or end_of_file the execution returns to the debugger and the last trace line is redisplayed N nodebug permanently This command switches tracing off for the remainder of the execution as well as for subsequent top level queries It affects the global flag debugging setting it to nodebug 14 7 Extending the Debugger 14 7 1 User defined Ports The standard set of ports in the debugger s box model can be extended by the programmer This facility is not so much intended for applications but rather for libraries that want to allow debugging in terms of concepts of the library Specific ports can be used to identify the interesting events during execution of the library code while the standard tracing of the library internals can be suppressed by compiling the library in nodebug mode The system provides 4 primitives that can generate 4 kinds of box model ports When inserted into the code and when the debugger is on they will cause execution to stop and enter the debugger displaying a trace line with the user defined port and data e trace_call po
270. r E extract numerator of a rational integer or rational integer denominator E extract denominator of a rational integer or rational integer sum L sum of list elements list number min L minimum of list elements list number max L maximum of list elements list number eval E evaluate runtime expression term number Argument types other than specified yield a type error As an argument type number stands 70 for integer rational float or breal with the type conversions as specified above As a result type number stands for the more general of the argument types The division operator yields either a rational or a float result depending on the value of the global flag prefer_rationals The same is true for the result of if an integer is raised to a negative integral power The relation between integer division and modulus operation mod is as follows X X mod Y X Y Y 8 3 2 Evaluation Mechanism An arithmetic expression is a Prolog term that is made up of variables numbers atoms and compound terms e g 3 1 5 Y sqrt pi Compound terms are evaluated by first evaluating their arguments and then calling the cor responding evaluation predicate The evaluation predicate associated with a compound term func a_1 an is the predicate func n 1 It receives a_l a_n as its first n arguments and returns a numeric result as its last argument This result is then used in the arithmetic computation For instance
271. r attached to a symbolic trigger 17 8 2 Creating Suspended Goals The most basic primitive to create a suspension is make_suspension Goal Priority Susp Module where Goal is the goal structure Priority is a small integer denoting the priority with which the goal should be woken and Susp is the resulting suspension Note that usually make_suspension 3 4 is not used directly but implicitly via suspend 3 4 described in section 17 6 which in addition attaches the suspension to a trigger condition A suspension which has not yet been scheduled for execution and executed is called sleeping a suspension which has already been executed is called executed or dead since it disappears 176 from the resolvent but see section 17 9 for an exception A newly created suspension is always sleeping however note that due to backtracking an executed suspension can become sleeping again Sometimes we use the term waking which is less precise and denotes the process of both scheduling and eventual execution By default suspensions are printed as follows the variants with invocation numbers are used when the debugger is active SUSP _78 susp sleeping suspension with id _78 SUSP _78 sched scheduled suspension with id _78 SUSP _78 dead dead suspension with id _78 SUSP 123 susp sleeping suspension with invocation number 123 SUSP 123 sched scheduled suspension with invocation number 123 SUSP 123 dead dead sus
272. r exported The macro expansion is performed by a user defined Prolog predicate 12 2 Using the macros The following declarations and built ins control macro expansion local macro TermClass TransPred Options define a macro for the given Term Class The transformation will be performed by the predicate TransPred export macro TermClass TransPred Options as above but available to other mod ules erase_macro TermClass Options erase a currently defined macro for TermClass This can only be done in the module where the definition was made current_macro TermClass TransPred 0Options Module retrieve information about currently defined visible macros Macros are selectively applied only to terms of the specified class TermClass can take two forms 99 Name Arity transform all terms with the specified functor type Type transform all terms of the specified type where Type is one of compound string integer rational float breal atom goal The TransPred argument specifies the predicate that will perform the transformation It has to be of arity 2 or 3 and should have the form trans_function OldTerm NewTerm Module At transformation time the system will call TransPred in the module where macro 3 was invoked The term to transform is passed as the first argument the second is a free variable which the transformation predicate should bind to the transformed term and the optional third arg
273. r hand must be explicitly destroyed in order to free the associated memory Data is entered into a store using store_set 3 and retrieved using store_get 3 It is possible to retrieve all keys with stored_keys 2 or the full contents of the table with stored_keys_and_values 2 Entries can be deleted via store_delete 2 or store_erase 1 The following example computes how many solutions of each kind a goal has We use an anonymous store into which we enter counter values using the solution term as the key to distinguish the different counters solutions_profile Sol Goal Profile store_create Store call Goal store_get Store Sol Old gt New is Old 1 store_set Store Sol New store_set Store Sol 1 fail stored_keys_and_values Store Profile Ja Running this code produces for example solutions_profile X member X a b c b a b R X X R a 2 b 3 c 1 Yes 0 00s cpu 9 5 Non logical Variables Non logical variables in ECL PS are a means of storing a copy of a Prolog term under a name an atom The atom is the name and the associated term is the value of the non logical variable This term may be of any form whether an integer or a huge compound structure Note that the associated term is being copied and so if it is not ground the retrieved term is not strictly TT identical to the stored one but is a variant of it There are two fundamental operations that can be performed on a no
274. redicate should delay The semantics of delay clauses is thus cleaner than many alternative approaches to delay primitives A delay clause is very similar to a normal Prolog clause It has the form delay lt Head gt if lt Body gt Note that more powerful versions of these constraints exist in other solvers such as the interval solver lib ic 167 A predicate may have one or more delay clauses They have to be textually before and con secutive with the normal clauses of the predicate they belong to The simplest example for a delay clause is one that checks if a variable is instantiated delay report_binding X if var X report_binding X printf Variable has been bound to wn X The operational semantics of the delay clauses is as follows when a procedure with delay clauses is called then the delay clauses are executed before executing the procedure itself If one of the delay clauses succeeds the call is suspended otherwise they are all tried in sequence and if all delay clauses fail the procedure is executed as usual The mechanism of executing a delay clause is similar to normal Prolog clauses with two excep tions e the unification of the goal with the delay clause head is not the usual Prolog unification but rather unidirectional pattern matching see also section 5 5 This means that the variables in the call cannot be bound by the matching if such a binding would be necessary to perform the unification
275. rgument If no handler has been defined a warning will be raised event hello WARNING no handler for event in hello Yes 0 00s cpu The event can be an anonymous event handle e g 108 event_create writeln handling E E event E handling EVENT 16 edbc0b20 E EVENT 16 edbc0b20 Yes 0 00s cpu Raising events explicitly is mainly useful for test purposes since it is almost the same as calling the handler directly Raising Events from Foreign Code To raise an event from within foreign C C code call ec_post_event ec_atom ec_did hello 0 This works both when the foreign code is called from ECL PS or when ECL PS is embedded into a foreign code host program Timed Events after events An event can be triggered after a specified amount of elapsed time The event is then handled sychronously by ECL PS These events are known as after events as they are set up so that the event occurs after a certain amount of elapsed time They are setup by one of the following predicates event_after EventId Time This sets up an event Eventld so that the event is raised once after Time seconds of elapsed time from when the predicate is executed EventId is an event identifier and Time is a positive number event_after_every EventId Time This sets up an event EventId so that the event is raised every Time seconds has elapsed from when the predicate is executed events_after EventList
276. riable 1 declarations E g in the above example one should use local variable count If it is necessary to access the value of a variable in other modules exported access predicates should be provided 9 6 Non logical Arrays Non logical arrays are a generalisation of the non logical variable capable of storing multiple values Arrays have to be declared in advance They have a fixed number of dimensions and a Though this feature could be used to make a copy of a term with new variables it is cleaner and more efficient to use copy _term 2 for that purpose 2A similar problem can occur when the counter is used by an interrupt handler 78 fixed size in each dimension Arrays in ECL PS are managed solely by special predicates In these predicates arrays are represented by compound terms e g matrix 5 8 where matrix is the name of the array the arity of 2 specifies the number of dimensions and the integers 5 and 8 specify the size in each dimension The number of elements this array can hold is thus 5 8 40 The elements of this array can be addressed from matrix 0 0 up to matrix 4 7 An array must be explicitly created using a local 1 array 1 declaration e g local array matrix 5 8 The array is only accessible from within the module where it was declared The declaration will create a two dimensional 5 by 8 array with 40 elements matrix 0 0 to matrix 4 7 Arrays can be erased using the predicate erase _array 1
277. ring data type The main argument against strings is that everything that can be done with strings can as well be done with atoms or with lists depending on the application Nevertheless in ECL PS it was decided to have the string data type so that users that are aware of the advantages and disadvantages of the different data types can always choose the most appropriate one The system provides efficient builtins for converting from one data type to another 5 4 1 Choosing The Appropriate Data Type Strings atoms and character lists differ in space consumption and in the time needed for per forming operations on the data Strings vs Character Lists Let us first compare strings with character lists The space consumption of a string is always less than that of the corresponding list For long strings it is asymptotically 16 times more compact Items of both types are allocated on the global stack which means that the space is reclaimed on failure and on garbage collection For the complexity of operations it must be kept in mind that the string type is essentially an array representation ie every character in the string can be immediately accessed via its index The list representation allows only sequential access The time complexity for extracting a substring when the position is given is therefore only dependent on the size of the substring for strings while for lists it is also dependent on the position of the substring Comparing two
278. rms completely it sometimes does not detect success eclipse 55 dif2 f X a f b b X X Delayed goals diff_pairs X b a b Link Link yes If we wanted to write a predicate that suspends if and only if the disequality cannot be decided we have to use a different approach The easiest way would be to process both terms completely each time the predicate is woken There are however better methods We can process the terms once when the predicate dif 2 is called filter out all possibly matching pairs and then create a suspension for each of them As soon as one of the suspensions is woken and it finds an incompatible binding the dif 2 predicate can succeed There are two problems e How to report the success There are N suspensions and each of them may be able to report success due to its bindings All others should be disposed of This can be solved by introducing a new variable which will be instantiated when the two terms become non unifyable Any predicate can then use this variable to ask or wait for the result At the same time when it is instantiated all suspensions are woken and finished 191 e How to find out that the predicate has failed We split the whole predicate into N inde pendent suspensions and only if all of them are eventually woken and they find identical pairs the predicate fails Any single suspension does not know if it is the last one or not To cope with this problem we can use the sh
279. rogram from the keyboard or to compile a program from a file Goals are entered after the prompt and are terminated by full stop and newline The ECL PS system may be exited by typing CTRL D UNIX or CTRL Z RETURN Windows at the top level prompt or by calling either the halt 0 or the exit 1 predicates 3 5 3 Compiling a program The square brackets or the compile 1 predicate are used to compile ECL PS source from a file If the goal compile myfile or the short hand notation myfile is called either as a query at the top level or within another goal the system looks for the file myfile or for a file called myfile pl or myfile ecl and compiles it The short hand notation may also be used to compile several files in sequence file_1 file_2 file_n 12 The compile 2 predicate may be used to compile a file or list of files into a module specified in the second argument If a file has been modified since it was compiled it may be recompiled by invoking the make 0 predicate This recompiles any files which have become out of date For more information on program compilation and the compiler please see chapter 6 3 5 4 Entering a program from the terminal Programs can be entered directly from the terminal as well as being read from files To do this simply compile the special file user That is user or compile user at a top level prompt The system then displays the compiler prompt which is a blank b
280. roperty Value e g the end of line sequence used the flushing behaviour the event raising behaviour the prompt etc 10 2 Communication via Streams The contents of a stream may be interpreted in one of the three basic ways The first one is to consider it as a sequence of characters so that the basic unit to be read or written is a character The second one interprets the stream as a sequence of tokens thus providing an interface to the Prolog lexical analyzer and the third one is to consider a stream as a sequence of Prolog terms 10 2 1 Character I O The get 1 2 and put 1 2 predicates corresponds to the first way of looking at streams The call get Char takes the next character from the current input stream and matches it as a single character with Char Note that a character in ECL PS is represented as an integer corresponding to the ASCII code of the character If the end of file has been reached then an exception is raised The call put Char puts the char Char on to the current output stream The predicates get Stream Char and put Stream Char work similarly on the specified stream The input and output is normally buffered by ECL PS To make I O in raw mode without buffering the predicates tyi 1 2 and tyo 1 2 are provided 10 2 2 Token I O The predicates read token 2 and read _token 3 read_token Token Class read_token Stream Token Class 87 represent the second way of interpreting stream
281. rt Port Invoc Term is used to create new ports similar to CALL ports but the port name can be chosen freely Such a port creates a new box There must be a corresponding trace_exit_port 0 to exit the box on success e trace_exit_port is used in conjunction with trace_call_port 3 to exit a box on success e trace_point_port Port Invoc Term is used to create a standalone port i e a port that causes the tracer to create a trace line but does not create enter or leave any box e trace parent_port Port is used to create an additional port for the parent box but does not enter or leave the box For example trace_call_port 3 and trace_exit_port 0 can be used to create a more readable trace in the presence of source transformations Imagine that the goal Y is X X 1 has been flattened into the goal sequence X X T T 1 Y By inserting the trace primitives the debugger can still show the original source before transformation p k YN trace_call_port call _ Y is X X 1 X X T T 1 Y trace_exit_port The trace then looks like this eclipse 8 p 3 Y 1 1 CALL p 3 Y gt creep 2 2 CALL Yis3x 3 1 skip 2 2 EXIT 8is3 3 1 gt creep 1 1 EXIT p 3 8 gt creep Y 8 139 Another example is the insertion of additional ports for existing boxes in particular the current parent box P 7 trace_parent_port clause1 writeln hello fail ps trace_parent_port clause2 writeln world
282. s as listed in the table above The arguments of the user defined arithmetic expression are not evaluated but passed unchanged to the evaluating predicate E g the expression twice 3 4 is transformed into the goal twice 3 4 Result rather than twice 7 Result This makes sense because otherwise it would not be possible to pass any compound term to the predicate If evaluation is wanted the user defined predicate can explicitly call is 2 or use eval 1 8 3 4 Runtime Expressions In order to enable efficient compilation of arithmetic expressions ECL PS requires that vari ables in compiled arithmetic expressions must be bound to numbers at runtime not symbolic expressions E g in the following code p 1 will only work when called with a numerical argu ment else it will raise error 24 p Number Res is 1 Number To make it work even when the argument gets bound to a symbolic expression at runtime use eval 1 as in the following example p Expr Res is 1 eval Expr If the expression is the only argument of is 2 the eval 1 may be omitted 8 4 Low Level Arithmetic Builtins The low level builtins like 3 sin 2 etc which are used to evaluate the predefined arith metic functions can also be called directly but this is not recommended for portability reasons Moreover there is no need to use them directly since the ECL PS compiler will transform all arithmetic expressions into calls to the corresponding low level buil
283. s 99 write mode 83 write 1 62 83 88 160 write 1 2 88 write 1 2 159 write 2 88 93 write_canonical 2 93 write_history 0 15 write_term 2 92 write_term 3 91 92 writeln 1 2 159 writeq 1 88 160 writeq 1 2 88 writeq 2 88 93 251 x examine goal debugger cmd 128 xref library 143 xref 2 146 z zap debugger cmd 126 261 262 Bibliography 1 10 11 12 13 D L Bowen DEC 10 Prolog User s Manual D A I occasional paper 27 University of Edinburgh December 1981 W F Clocksin and C S Mellish Programming in Prolog Springer Verlag 1981 Mehmet Dincbas and Jean Pierre Le Pape Metacontrol of Logic Programs in METALOG In ICOT editor Proceedings of the International Conference on Fifth Generation Computer Systems 1984 pages 361 370 1984 ECLiPSe 3 4 Extensions User Manual 1994 Micha Meier Event handling in Prolog In Proceedings of the North American Conference on Logic Programming Cleveland October 1989 Micha Meier Compilation of compound terms in Prolog In Proceedings of the NACLP 90 Austin October 1990 Micha Meier Abderrahmane Aggoun David Chan Pierre Dufresne Reinhard Enders Do minique Henry de Villeneuve Alexander Herold Philip Kay Bruno Perez Emmanuel van Rossum and Joachim Schimpf SEPIA an extendible Prolog system In Proceedings of the 11th World Computer Congress IFIP 89 pages 1127 1132 San Francisco August 1989
284. s suspended on a trigger using the syntax trigger Name in suspend 3 as in the following example suspend writeln woken 0 trigger happy There is 1 delayed goal Yes 0 00s cpu The built in trigger 1 can then be used to wake the goal suspend writeln woken 0 trigger happy trigger happy woken Yes 0 00s cpu Of course symbolic triggers can be used together with other waking conditions to specify alter native reasons to wake a goal Postponed Goals There is one system defined trigger called postponed It is provided as a way to postpone the triggering of a goal as much as possible This trigger is pulled just before the end of certain encapsulated executions like e end of toplevel execution e inside all solution predicates findall 3 setof 3 e inside bb_min 3 and minimize 2 A suspension should be attached to the postponed trigger only when more precisely variables which have an ic attribute see chapter 16 175 e it might not have any other waking conditions left e and it might at the same time have other waking conditions left that could make it fail during further execution e and one does not want to execute it now e g because it is known to succeed or re suspend An example is a goal that originally woke on modifications of the upper bound of an interval variable If the variable gets instantiated to its upper bound there is no need to wake the goal since the bound has not changed b
285. s with the occur check may sometimes be very slow and most Prolog programs do not need it because no cyclic terms are created Note that this flag must be set both at compile time and at runtime in order to actually perform the checks In particular as ECL PS built ins are compiled without this flag set the builtins will not perform the check variable names ECL PS can remember the source variable names of the input variables When this flag is on the compiled predicates will keep the names of the source variables and will display them whenever the variables are printed In this case the usage of the global stack and code space is slightly higher to store the name and the efficiency of the code is marginally lower Setting this flag to check_singletons has the same effect as on but additionally the compiler will issue warnings about variables which occur only once in a clause and whose names do not start with an underscore character all dynamic When this flag is on all procedures are compiled as dynamic ones and there is no equivalent static 1 declaration It can be used to port programs from older interpreters which rely heavily on the fact that all predicates in these interpreters were dynamic Another possible use is to switch it on at the beginning of a file that contains many dynamic predicates and switch it off at its end macro_expansion This is in fact a parser flag is enables or disables the macro transformation see Chapter
286. se is the library ifdef which implements a C like conditional compilation assert Clause This predicate compiles the given clause of a dynamic predicate 6 5 Module Compilation One source file can contain several modules and one module may spread over several files The module structure is controlled by the module 1 directive which tells the compiler that all subsequent input up to the end of file or another module directive will be part of the given module When it encounters the module 1 directive the compiler first erases previous contents of this module if there was any before starting to compile predicates into it This means that if the contents of a module has to be generated incrementally the module directive cannot be used because the previous contents of the module would be destroyed In this case the predicate compile File Module should be used 6 6 Mode Declarations Mode declarations are a way for the user to give some additional information to the compiler thus enabling it to do a better job The ECL PS compiler makes use of the mode information mainly to improve indexing and to reduce code size Mode declarations are optional They specify the argument instantiation patterns that a predi cate will be called with at runtime for example mode p q r 7 The possible argument modes and their meaning are The argument is instantiated i e it is not a variable The argument is ground Th
287. se sentence hello there X no more solution 12 3 2 Mapping to Prolog Clauses Grammar rule are translated to Prolog clauses by adding two arguments which represent the input before and after the nonterminal which is represented by the rule The effect of the transformation can be observed e g by switching on the all_dynamic flag so that the compiled clauses can be listed eclipse 1 set_flag all_dynamic on user p X gt q X p X gt a user compiled traceable 296 bytes in 0 25 seconds yes eclipse 2 listing p _g212 _g214 4216 t q _g212 _g214 _g216 p _g212 _g214 _g216 104 _g214 al_g216 yes 12 3 3 Parsing other Data Structures DCGs are in principle not limited to the parsing of lists The predicate C 3 is responsible for reading resp generating the input tokens The default definition is C Token Rest Token Rest The first argument represents the parsing input before consuming Token and Rest is the input after consuming Token By redefining C 3 it is possible to apply a DCG to other input sources than a list e g to parse directly from an I O stream local C 3 C Stream Pos0 Token Stream Pos1 seek Stream Pos0 read_string Stream _ TokenString atom_string Token TokenString at Stream Posi sentence gt noun is adjective noun gt prolog lisp adjective gt boring great This
288. sis a a ee ee ee ek es 69 8 35 ArithmeticHunetions ia ta Ate aS 69 8 3 1 Predefined Arithmetic Functions 2 220004 69 8 3 2 Evaluation Mechanism 2 02 ee 71 8 3 3 User Defined Arithmetic Functions 04 71 8 3 4 Runtime Expressions 2 2 0 0 0 ee a 72 8 4 Low Level Arithmetic Builtins o e e 72 8 5 The Multi Directional Predicates plus 3 and times 3 72 8 6 Arithmetic and Coroutining 0 00 000 eee ee 73 Non logical Storage and References 75 931 slntroductionie sc a aot A Bae eae cee Oh E es 75 QD O E Nate Teele ite bide tet A EO IS De She oo eA eta Sth 75 9 3 i Shelyes ica walk ae fale ee Sch wee ae OE ee ae A 76 QA SLOPES Calado E e it heh a fen ee Ba a a Geib lew ho aaa fe djs 76 9 5 Non logical Variables 2 e 77 9 6 Non logical Arrays ee 78 927 Global Referenc s 2 04 22 0 ad wen td ee ee a Xe oe ee PS 80 iii 10 Input and Output 83 LOL Streams e e fa a A ee aa AA ee 83 10 1 1 Predefined Streams eee ee ee 83 10 1 2 Stream Identifiers and Aliases e e e 84 10 1 3 Opening New Streams 0 000 ee ee ee 84 10 14 Closing Streams e a atk a Bam A a ee es 86 10 1 5 Redirecting Streams ee 86 10 1 6 Finding Streams 204 25g ua shee be ai a oe ee e dd AA 86 10 1 7 Stream Properties 2 0 ae a a A E ee 87 10 2 Communication via Streams ee 87 1024 Char
289. sist in the generation of compiler invocation mode directives Port Profiler Collects statistics about the running program in terms of box model port coun ters Timing Profiler Samples the running program at regular intervals to give a statistical sum mary of where the execution time is spent 143 Visualisation framework A graphical environment for the visualisation of search and prop agation in constraint programs The Visualisation Tools Manual discusses the use of this environment This section focuses on the program development libraries and two complementary runtime analysis tools the profiler and the coverage library Throughout this chapter the use of each of the tools is demonstrated on the following n queens code module queen export queen 2 queen Data Out qperm Data Out safe Qut qperm qperm X Y UIV adelete U X Y Z qperm Z V qdelete A A L L qdelete X A HIT AIR qdelete X H T R safe safe NIL nodiag L N 1 safe L nodiag _ _ nodiag N L B D D N B D B N D1 is D 1 nodiag L B D1 15 2 Heuristic Program Checker The Heuristic Program Checking tool generates warning messages for dubious programming constructs and violation of naming conventions for an ECLiPSe source module or file It is loaded as follows lib lint The heuristic rules currently enforced are based on the style guid
290. so connect two processes on the same machine The address of a socket is then identified by the host name and the port number The host name is the same as obtained e g with the get_flag hostname Host The port identifies the channel on the host which is used for the communication This is available under both Unix and Windows operating systems 21 2 Stream Connection internet domain This type of communication is very similar to pipes the stream communication is reliable and there are no boundaries between the messages Stream sockets always require explicit connection from both communicating processes After a socket is created with the socket 3 predicate one of the processes the server gives it a name and waits for a connection The other process uses the same name when connecting to the 209 former process After the connection is established both processes can read and write on the socket and so the difference between the server and the client disappears The socket addresses contain the host name and the port number Since one port number identifies the socket on a given host the process cannot itself specify the port number it wants to use because it can be already in use by another process Therefore the safe approach is to use the default and let the system specify the port number which is achieved by leaving the port uninstantiated Since the host is always known it can also be left uninstantiated The client however has to s
291. solves the conflict Alternatively the conflict can remain unresolved and qualified access can be used whenever the predicates are referred to see 7 3 2 Conflicts of the second type give rise to an error or warning message when the compiler en counters the local re definition To avoid that an explicit local 1 declaration has to be used local write 1 write X my own version of write 1 Note that the local 1 declaration must occur textually before any use of the predicate inside the module 58 7 3 2 Qualified Access via 2 Normally it is convenient to import predicates which are needed By importing they become visible and can be used within the module in the same way as local definitions However sometimes it is preferable to explicitly specify from which module a definition is meant to be taken This is the case for example when multiple versions of the predicate are needed or when the presence of a local definition makes it impossible to import a predicate of the same name from elsewhere A call with explicit module qualification is done using 2 and looks like this lists print_list 1 2 3 Here the module where the definition of print_list 1 is looked up the lookup module is explicitly specified To call print_list 1 like this it is not necessary to make print_list 1 visible The only requirement is that it is exported or reexported from the module lists Note that if the called predicate is in operator not
292. spended In the same way the user can only interact with the remote tools window when execution in 22 Alu lol ol tktoots tel J a tktools tel File Tools H File Tools TKTools Active Resume ECUPSe Figure 4 3 Remote Development Tools Toplevel left ECL PS active right remote tools active the ECL PS session is suspended The toplevel window of the remote tools has an indicator showing which side has control see Figure 4 3 To allow ECL PS to resume execution control is transferred back from the remote tools to ECL PS This can either be done automatically from the tools e g when one of the debug buttons is pressed in the tracer tool or control can be transferred explicitly back to ECL PS via the Resume ECLiPSe button on the remote tools window Starting Remote Tools To use the remote tools the user must first load the remote_tools library with lib remote_tools After loading the library the user can start the remote tools by starting the development tools as a separate program and then manually attach the program to the ECL PS session This allows the development tools to be run on a different machine from the ECL PS session In this case the user initiates the attachment in ECL PS with attach_tools 0 eclipse 2 attach_tools Socket created at address holborn icparc ic ac uk 22849 ECL PS prints the host and port address it expects the remote tools to attach to and execution is no
293. stfix xf yf operators A 2 1 Character Classes The following character classes exist 221 Character Class upper_case underline lower_case digit blank_space end_of_line atom_quote string_quote list_quote radix ascii solo special line_comment escape first_comment second_comment symbol Notation Used ES CM1 CM2 SY Default Members all upper case letters all lower case letters digits space tab and nonprintable ASCII characters line feed gt CCL I F 1 H lt gt 7 07 7808 The character class of any character can be modified by a chtab declaration A 2 2 Groups of characters Group Type Notation alphanumerical ALP any character ANY non escape NES sign SGN A 2 3 Valid Tokens Valid Characters UC UL LCN any character except escape Terms are defined in terms of tokens and tokens are defined in terms of characters and character classes Individual tokens can be read with the predicates read_token 2 and read_token 3 The description of the valid tokens follows Constants 1 atoms ATOM LC ALP SY CM1 CM2 ES AQ NES ES ANY AQ SL 222 2 numbers a integers INT SGN N b based integers INTBAS SGN N AQ RA N LC UC The base must be an integer between 1 and 36 included the value being valid for this base If the syntax option iso_base_prefix is active the syntax
294. sts T1 T2 List Link equal_terms T1 T2 List Link Ti FlArgs1 T2 FlArgs2 equal_lists Args1 Args2 List Link equal_lists L L equal_lists X1 A1 X2 A2 List Link equal_args X1 X2 List L1 nonvar List gt Li A1 A2 Link equal_lists A1 A2 L1 Link Ds diff_pairs A1 A2 List Link gt A1 A2 gt diff_pairs List Link var A1 var A2 gt suspend diff_pairs A1 A2 List Link 3 A1 A2 gt bound equal_terms A1 A2 NewList NewLink gt NewLink List prepend to the list diff_pairs NewList Link true 190 Now we can see that compound terms are processed up to the first potentially matching pair and then the continuations are stored eclipse 30 dif2 f g X Y h Z 1 g A B h 2 C X X Delayed goals diff_pairs X A Y B h Z 1 h 2 C ILink Link yes When a variable in the first pair is bound the search proceeds to the next pair eclipse 31 dif2 f g X Y h Z 1 f g A B A 2 C X A Ca Y Delayed goals diff _pairs Y B O O Z 19 h 2 C Link Link yes dif2 2 does not do any unnecessary processing so it is asymptotically much better than the built in 2 This predicate however can be used only to impose a constraint on the two terms i e it is a tell constraint only It uses the approach of eager failure and lazy success Since it does not process the te
295. t Access A number of predicates and global flags is provided to get more or less useful information from the operating system environment 20 2 1 Command Line Arguments Arguments provided on the UNIX or DOS command line are accessed by the builtins arge 1 which gives the number of command line arguments including the command name itself and argv 2 which returns a requested positional argument in string form If the first argument of argv 2 is the atom all then a list of all command line arguments is returned 20 2 2 Environment Variables On UNIX environment variables are another way to pass information to the ECL PS process Their string value can be read using getenv 2 eclipse 1 getenv HOME Home Home usr octopus yes The environment variables available on Window is version dependent and is not a recommended method of passing information 20 2 3 Exiting ECL PS When ECL PS is exited it can give a return code to the operating system This is done by using exit 1 It exits ECL PS and returns its integer argument to the operating system 203 eclipse 1 exit 99 csh echo status 99 Note that halt is equivalent to exit 0 20 2 4 Time and Date The current date can be obtained in the form of a UNIX date string eclipse 1 date Today Today Tue May 29 20 49 39 1990 n yes The library calendar contains a utility predicate to convert this string into a Prolog structure Another way
296. te interface see the Embedding and Interfacing Manual This allows any ECL PS session to use the development tools as long as there is the capability for graphical display The main purpose for the remote_tools library is to allow the user to use the development tools in situations where s he cannot use the Tcl Tk embedding interface e g if ECL PS is already embedded into another programming language or if the user needs to use the tty interface for ECL PS Once attached to an ECL PS session the remote development tools has its own window as shown in Figure 4 3 The Tools menu is the same as in TkECL PS providing access to the same suite of development tools The main body of the window consists of one button and a status indicator The indicator shows wheather the tools can be used or not the tools cannot be used when the ECL PS is active and the button is used to pass control explicitly to ECL PSS The ECL PS session and the development tools are two separate processes and in fact they can be running on different machines that are connected to each other via the remote Tcl Tk interface The interactions of the two processes are synchronised in that there is a thread like flow of control between them only one process can be active at any time The interaction is similar to the standard interaction between a debugger and the program being debugged debugging commands can only be issued while the execution of the program is su
297. ted If A fails C is executed It is similar to gt 2 with the exception that gt 2 cuts both A and the disjunction if A succeeds whereas gt 2 cuts only the disjunction 41 42 Chapter 6 The Compiler ECL PS has an efficient incremental compiler which compiles Prolog source into the instructions of an abstract machine and they are then executed by an emulator The compiler is very fast it compiles about 1000 lines sec on a Sun 4 and this makes the usual debugging cycle acceptably short Unlike other Prolog systems the ECL PS compiler generates code that can be used for debugging so that no separate interpreter is necessary and also the debugged code runs faster The ECL PS compiler is interactive and incremental which means that Prolog programs are compiled during a ECL PS session directly into the Prolog database In addition object code of ECL PS programs can be generated and stored into a file which can then be loaded into a different session of ECL PS See section 6 10 for more details 6 1 Program Source When reading the input source the compiler distinguishes clauses and directives Directives are terms with main functor 1 or 1 When the compiler encounters them it executes immediately their first argument as a Prolog goal If this goal succeeds the compiler continues to the next input term without reporting the answer to the user If the directive fails an event is raised All other input
298. term path 1 country of capital 2 attr suspend inst of suspend 1 gt In this example except for the toplevel argument all the other positions are either have field names or are attributes This is reflected in the path for example country of capital 2 shows that the field name for the selected argument position 2 shown in brackets is country and the structure name is capital For the position of the selected attribute suspend of the attributed variable C the path position is shown as attr suspend Interaction between inspect subterm and output modes The debugger commands that affect the print formats in the debugger also affects the printed current subterm Thus both the print depth and output mode of the printed subterm can be changed The changing of the output modes can have a significant impact on the inspect mode This is because for terms which are transformed by write macros before they are printed see chapter 12 different terms can be printed depending on the settings of the output modes In particular output transformation is used to hide many of the implementation related extra fields and even term names of many ECL PS data structures such as those used in the finite domain library For the purposes of inspect subterms the term that is inspected is always the printed form of the term and thus changing the output mode can change the term that is being inspected Consider the example of looking at
299. that in contrast to when declarations there are no syntactic restrictions on the head of a delay clause in particular it can contain any compound terms and repeated variables In the clause body a delay clause allows more flexibility by supporting programming with a subset of builtins In general it is a matter of taste whether specifying delay conditions or execute conditions is more straightforward However the semantics of delay clauses is certainly more intuitive in that missing delay clauses simply imply no delay while missing when declarations imply a most general when ever declaration 184 Chapter 18 More About Suspension The fundamentals of goal suspension and waking were described in the previous chapter This chapter looks at some applications and examples in greater detail 18 1 Waiting for Instantiation Goals that are to be woken when one or more variables become instantiated use the inst list For instance a predicate freeze Term Goal which delays and is woken as soon as any variable in Term becomes instantiated can be implemented as follows freeze Term Goal suspend Goal 3 Term gt inst or equivalently by freeze Term Goal make_suspension Goal 3 Susp insert_suspension Term Susp inst of suspend suspend When it is called with a nonground term it produces a delayed goal and when one variable is instantiated the goal is woken eclipse 2 freeze X write hello X X Delayed
300. the debug_compile flag e silent_debug generate code which cannot be inspected by the debugger but which allows to debug predicates called by it This is similar to setting the leash flag of all subgoals in the following clauses to notrace This option is useful e g for library predicates which call other Prolog predicates the user wants to see in the debugger the call to the library predicate and to the invoked predicate but no internal calls in the library predicates e expand do in line expansion of some subgoals like 2 is 2 and others This code can still be inspected with the debugger but the expanded subgoals look differently than in the normal debugged code or their arguments cannot be seen This pragma overrides the global setting of the goal_expansion flag e noexpand inhibit the in line goal expansion This pragma overrides the global setting of the goal_expansion flag e skip set the skip flag of all following predicates to on e noskip set the skip flag of all following predicates to off e system set the type flag of all following predicates to built_in Moreover all following predicates will have unspecified source_file and source_line flags By default the compiler works as if the pragmas debug expand and noskip were specified The pragma is active from its specification in the file until the file end or until it is disabled by another pragma Recursive compilations or calls to other compiling predicates are
301. the expression above would be evaluated by the goal sequence 3 1 5 T1 sqrt 3 14159 T2 Y T2 T3 T1 T3 T4 where Ti are auxiliary variables created by the system to hold intermediate results Although this evaluation mechanism is usually transparent to the user it becomes visible when errors occur when subgoals are delayed or when inline expanded code is traced 8 3 3 User Defined Arithmetic Functions This evaluation mechanism outlined above is not restricted to the predefined arithmetic functions shown in the table In fact it works for all atoms and compound terms It is therefore possible to define a new arithmetic operation by just defining an evaluating predicate eclipse 1 user op 200 yf let s have some syntaxtic sugar I N F fac N 1 F fac O FO F F FO fac N FO F N1 is N 1 F1 is FO N fac N1 F1 F user compiled traceable 504 bytes in 0 00 seconds yes eclipse 2 X is 23 calls 2 X 25852016738884976640000 yes Note that this mechanism is not only useful for user defined predicates but can also be used to call ECL PS built ins inside arithmetic expressions eg T is cputime TO L is string_length abcde 1 71 which call cputime 1 and string length 2 respectively Any predicate that returns a number as its last argument can be used in a similar manner However there is a difference compared to the evaluation of the predefined arithmetic function
302. the left hand side argument of the following infix or postfix In order to decide whether that is the case ECL PS uses the operator s relative precedences and their associativities and if necessary a two token lookahead If this rules out the prefix interpretation then the prefix is treated as a simple atom In the rare case where this limited lookahead is not enough to disambigute the prefix must be explicitly enclosed in parentheses e Another source of ambiguity are operators which have been declared both infix and postfix In this case ECL PS uses a one token lookahead to check whether the infix interpretation can be ruled out If yes the operator is interpreted as postfix otherwise as infix Again in rare cases parentheses may be necessary to enforce the interpretation as postfix e When a binary prefix operator is followed by an infix operator then either of them could be the main functor Faced with the ambiguity the system will prefer the infix interpretation To force the binary prefix to be recognised the infix must be enclosed in parentheses A 4 Syntax Differences between ECL PS and other Prologs ECL PS supports the following extensions of Prolog syntax e Attributed variables X Attr e Rational numbers 3_4 Bounded real numbers 1 99__2 01 Array subscripts Matrix 3 4 e Structures with named fields emp age 33 salary 33000 e Binary prefix operators some X p X Some of these extensions can be disabled vi
303. the setof implementation while allowing to trace the argument goal Setting a procedure to skipped with set_flag 3 or skipped 1 is another way to speed up the execution of procedures that do not need to be debugged The debugger will ignore everything that is called inside the skipped procedure like for a procedure compiled in nodbgcomp mode However the debugger will keep track of the execution of a procedure skipped with the command s of the debugger so that it will be possible to creep in it on later backtracking or switch the debugger to creep mode while the skip is running e g by interrupting a looping predicate with C and switching to creep mode The two predicates trace 1 and debug 1 can be used to switch on the debugger in the middle of a program They execute their argument in creep or leap mode respectively This is particularly useful when debugging large programs that take too much time or need a lot of memory to run completely with the debugger eclipse 1 debugging Debugger is switched off yes eclipse 2 big_goal1 trace buggy_goal big_goal2 123 Start debugging creep mode 1 O CALL buggy_goal gt c creep 1 O EXIT buggy_goal gt c creep Stop debugging yes It is also possible to enable the debugger in the middle of execution without changing the code To do so use set_flag 3 to set the start_tracing flag of the predicate of interest Tracing will then start in leap mode at every call
304. ther by using the drop down list to the right of the Query Entry field or by using the up and down arrow keys while editing the Query Entry field If ECL PS cannot find a solution to the query it will print No in the Results section of the TkECL PS window If it finds a solution and knows there are no more it will print it in the Results section and then print Yes If it finds a solution and there may be more it will print the solution found as before print More and enable the more button Clicking on the more button tells ECL PS to try to find another solution In all cases it also prints the total time taken to execute the query Note that a query can be interrupted during execution by clicking on the interrupt button 3 4 3 Editing a file If you wish to edit a file e g a program source file then you may do so by selecting the Edit option from the File menu This will bring up a file selection dialog Select the file you wish to edit and click on the Open button When you have finished editing the file save it After you ve saved it if you wish to update the version compiled into ECL PS assuming it had been compiled previously simply click on the make button You can change which program is used to edit your file by using the TkECL PS Preference Editor available from the Tools menu 3 4 4 Debugging a program To help diagnose problems in ECL PS programs TkECL PS provides the tracer This can be invoked by selecti
305. this example the child process can be terminated by closing its standard input in other cases it may be necessary to send a signal The built in wait 2 is then used to wait for the process to terminate and to obtain its exit status Don t forget to close the ECL PS streams that were opend by exec 3 eclipse 4 close in wait P S P 9759 S 0 More yes 207 eclipse 5 at_eof out close out yes 20 4 3 Interprocess Signals The UNIX or the appropriate Windows signals are all mapped to ECL PS interrupts Their names and numbers may vary on different machines Refer to the operating system documen tation for details The way to deal with incoming signals is to define a Prolog or external predicate and declare it as the interrupt handler for this interrupt using set_interrupt_handler 2 Interrupt handlers can be established for all signals except those that are not allowed to be caught by the process like e g the kill signal 9 For a description of event handling in general see chapter 13 For explicitly sending signals to other processes kill 2 is provided which is a direct interface to the UNIX system call kill 2 Note that some signals can be set up to be raised automatically e g sigio can be raised when data arrives on a pipe 208 Chapter 21 Interprocess Communication ECL PS contains built in predicates that support interprocess communications using sockets Sockets implement bidirectional channe
306. tins 8 5 The Multi Directional Predicates plus 3 and times 3 A drawback of arithmetic using is 2 is that the right hand side must be fully instantiated at evaluation time Often it is desirable to have predicates that define true logic relationships between their arguments like Z is the sum of X and Y For integer addition and multiplication this is provided as plus X Y Z True if the sum of X and Y is Z At most one of X Y Z can be a variable times X Y Z True if the product of X and Y is Z At most one of X Y Z can be a variable They work only with integer arguments but any single argument can be a variable which is then instantiated so that the relation holds If more than one argument is uninstantiated an instantiation fault is produced Note that if one of the first two arguments is a variable a solution doesn t necessarily exist For example the following goal has no integer solution 72 eclipse 1 times 2 X 3 no more solution Since any one of the arguments of these two predicates can be a variable it does not make much sense to use them in arithmetic expressions where always the first arguments are taken as input and the last one as output 8 6 Arithmetic and Coroutining Arithmetic comparisons can be delayed until their arguments are instantiated instead of gener ating an instantiation fault by passing the comparison to the suspend solver see section 17 3 This gives a form of coroutining
307. tiplication number x number number El E2 division number x number see below E1 E2 integer division integer x integer integer El mod E2 modulus operation integer x integer integer gcd E1 E2 greatest common divisor integer x integer integer lem E1 E2 least common multiple integer x integer integer El E2 power operation number x number number min E1 E2 minimum of 2 values number x number number max E1 E2 maximum of 2 values number x number number NE bitwise complement integer integer El E2 bitwise conjunction integer x integer integer El E2 bitwise disjunction integer x integer integer xor E1 E2 bitwise exclusive disjunction integer x integer integer El gt gt E2 shift El right by E2 bits integer x integer integer El lt lt E2 shift El left by E2 bits integer x integer integer sin E trigonometric function number float cos E trigonometric function number float tan E trigonometric function number float asin E trigonometric function number float acos E trigonometric function number float atan E trigonometric function number float exp E exponential function e number float In E natural logarithm number float sqrt E square root number float pi the constant pi 3 1415926 float e the constant e 2 7182818 float fix E convert to integer truncate number integer float E convert to float number float rational E convert to rational number rational rationalize E convert to rational number rational numerato
308. to access the current time and date is the global flag unix_time It returns the current time in the traditional UNIX measure i e in seconds since 00 00 00 GMT Jan 1 1970 eclipse 1 get_flag unix_time Now Now 644008011 yes Other interesting timings concern the resource usage of the running ECL PS The statistics 2 builtin gives three different times the user cpu time the system cpu time and the elapsed real time since the process was started all in seconds eclipse 1 statistics times Used Used 0 916667 1 61667 2458 88 yes The first figure user cpu time is the same as given by cputime 1 20 2 5 Host Computer Access to the name and unique identification of the host computer where the system is running can be obtained by the two global flags hostname and hostid accessed via get_flag 2 or env 0 These flags might not be available on all machines get_flag 2 fails in these cases 20 2 6 Calling C Functions Other data may be obtained with the predicate call_c 2 which allows to call directly any C function which is linked to the Prolog system Functions which are not linked can be loaded dynamically with the load 1 predicate 20 3 File System A number of built in predicates is provided for dealing with files and directories Here we consider only the file as a whole for opening files and accessing their contents refer to chapter 10 204 20 3 1 Current Directory The current working directory is an
309. to send a signal to the own process The predicate get_interrupt_handler 3 may be used to find the current interrupt handler for an interrupt N in the same manner as get_event_handler get_interrupt_handler N PredSpec HomeModule An interrupt handler has one optional argument which is the interrupt number There is no argument corresponding to the error culprit since the interrupt has no relation to the currently executed predicate A handler may be defined which takes no argument such as when the handler is defined for only one interrupt type If the handler has one argument the identifier of the interrupt is passed to the handler when it is called The following is the list of predefined interrupt handlers default 0 performs the standard UNIX handling of the specified interrupt signal Setting this handler is equivalent to calling signal N SIG_DFL on the C level Thus e g specifying set_interrupt_handler int default 0 will exit the ECL PS system when AC is pressed true 0 This is equivalent to calling signal N SIG_IGN on the C level ie the interrupt is ignored throw 1 Invoke exit_block 1 with the interupt s symbolic name abort 0 Invoke exit_block abort 115 halt 0 Terminate the ECL PS process internal 0 Used by ECL PS to implement internal functionality like the profiler This is not intended to be used by the user event 1 The signal is handled by posting a synchronous event The ev
310. tream is the empty string and the variable is bound to this value eclipse 1 open string S update s gan yes Once a string stream is opened all predicates using streams can take it as argument and perform I O on it In particular the predicates seek 2 and at 2 can be used with them While writing into a stream changes the stream contents destructively the initial string that has been opened will never be affected The new stream contents can be retrieved either by reading from the string stream or as a whole by using get_stream_info 3 eclipse 1 S abcdef open string S write s write s S abcdef yes eclipse 2 get_stream_info s name S S def yes eclipse 3 seek s 1 write s get_stream_info s name S S def yes eclipse 4 seek s end_of_file write s ine get_stream_info s name S S define yes 90 10 3 2 Queue streams A queue stream is opened by the open 3 predicate open queue InitString Mode Stream The initial queue contents is InitString It can be seen as a string which gets extended at its end on writing and consumed at its beginning on reading eclipse 11 open queue update q write q hello write q wo yes eclipse 12 read_string q _ X S hello yes eclipse 13 write q rld read q X S world yes eclipse 14 at_eof q yes It is not allowed to seek on a queue Therefore
311. ts as a test delay integer_list L if var L delay integer_list X _ if var X integer_list integer_list XIT integer X integer_list T e Delay if the first two arguments are identical and the third is a variable delay p X X Y if var Y e Delay if the argument is a structure whose first subterm is not ground delay p X if compound X arg 1 X Y nonground Y e Delay if the argument term contains 2 or more variables delay p X if nonground 2 X e The 2 predicate as a delaying condition is useful mainly in predicates like X Y Z which need not be delayed if X Z Y can be directly bound to 0 provided that X is later bound to a number or it is not bound at all The condition X Y makes sense only if X or Y are nonground a delay clause delay p X Y if X Y executed with the call p a b of course succeeds and the call delays forever since no variable binding can wake it CAUTION It may happen that the symbol is erroneously used instead of if in the delay clause To indicate this error the compiler complains about redefinition of the built in predicate delay 1 17 6 Explicit supension with suspend 3 While delay clauses are an elegant declarative way of specifying how a program should execute it is sometimes necessary to be more explicit about suspension and waking conditions The built in predicate suspend 3 is provided for this purpose It allows to explicitly create a susp
312. ts purpose is to give the advanced user a better understanding of how the system uses memory resources In a high level language like Prolog it is often not obvious for the programmer to see where the system allocates or frees memory The sizes of the different memory areas can be queried by means of the predicate statistics 2 and statistics 0 prints a summary of all these data Here is a sample output eclipse 1 statistics times 1 12 0 09 2 74 seconds session_time 2 74 seconds event_time 2 74 seconds global_stack_used 1936 bytes global_stack_allocated 4456448 bytes global_stack_peak 4456448 bytes trail_stack_used 64 bytes trail_stack_allocated 262144 bytes trail_stack_peak 4456448 bytes control_stack_used 564 bytes control_stack_allocated 262144 bytes control_stack_peak 262144 bytes local_stack_used 492 bytes local_stack_allocated 262144 bytes local_stack_peak 262144 bytes shared_heap_allocated 1613824 bytes shared_heap_used 1411000 bytes private_heap_allocated 73728 bytes private_heap_used 36992 bytes gc_number 1 gc_collected 23472 0 bytes gc_area 23560 bytes 197 ge_ratio 99 6264855687606 gc_time 0 0 seconds dictionary_entries 3252 dict_hash_usage 2117 8192 dict_hash_collisions 314 2117 dict_gc_number 2 dict_gc_time 0 01 seconds The used figures indicate the actual usage at the moment the statistics built in was called The allocated value is the amount of memory that is reserved for
313. tval 2 arguments and the terms obtained by getval 2 are thus not identical to the original terms in particular their variables are different Sometimes it is necessary to be able to access the original term with its variables i e to have global variables in the meaning of conventional programming languages A typical example is global state that a set of predicates wants to share without having to pass an argument pair through all the predicate invocations ECL PSS offers the possibility to store references to general terms and to access them even inside predicates that have no common variables with the predicate that has stored them They are stored in so called references For example local reference p or local reference p 0 80 creates a named reference p with an initial value of 0 which can be used to store references to terms This reference is accessed and modified in the same way as non logical variables with setval 2 and getval 2 but the following points are different for references e the accessed term is identical to the stored term with its current substitutions eclipse 1 local reference a variable b yes eclipse 2 Term p X setval a Term getval a Y Y Term X X Y p X Term p X yes eclipse 3 Term p X setval b Term getval b Y Y Term no more solution e the modifications are backtrackable when the execution fails over the setval 2 call the previous
314. ument is the module where the term is read or written Options is a list which may be empty in this case the macro defaults to a local read term macro or contain specifications from the following categories e mode read This is a read macro and shall be applied after reading a term default write This is a write macro and shall be applied before printing a term e type term Transform all terms default clause Transform only if the term is a program clause i e inside compile 1 assert 1 etc Write macros are applied using the C option in the printf 2 predicate goal Goal read macros are transformed only if the term is a subgoal in the body of a program clause Goal write macros are applied using the G option in the printf 2 predicate e additional specification protect_arg Disable transformation of subterms optional top_only Consider only the whole term not subterms optional The following shorthands exist local export portray TermClass TransPred Options portray 3 is like macro 3 but the write option is implied inline PredSpec TransPred inline 2 is the same as a goal read macro The visibility is inherited from the transformed predicate Here is an example of a conditional read macro eclipse 1 user trans_a a X Y b Y transform a 2 into b 1 number X but only under these X gt 0 conditions type goal stands for suspensions 100 local macro a
315. up from its current position This is done by typing the uparrow key This key is mapped to A by the debugger so one can also type A Typing A may be necessary for some configurations combination of keyboards and operating systems because the uparrow key is not correctly mapped to A An optional argument can preceded the uparrow keystroke which indicates the number of levels to move up The default is 1 1 1 CALL foo a g b 1 21 3 gt 2 lt NL gt g b 1 21 INSPECT g 2 gt 1 lt NL gt b INSPECT atom gt up subterm g b 1 21 130 INSPECT g 2 foo a g b 1 2 3 INSPECT foo 3 gt gt lup subterm The debugger prints up subterm when the uparrow key is typed The current subterm moves back up the structure to its parent for each level it moves up and the above move can be done directly by specifying 2 as the levels to move up b INSPECT atom foo a g b 1 2 3 INSPECT foo 3 gt gt 2up subterm If the number of levels specified is more than the number of levels that can be traversed up the current subterm stops at the toplevel 1 1 CALL foo a g b 1 21 3 g b 11 21 INSPECT g 2 gt 2 lt NL gt gt 2 lt NL gt 1 2 INSPECT list foo a g b 1 2 3 INSPECT fo0 3 gt 1 head 2 tail gt 5up subterm Move current subterm to toplevel It is possible to quickly move back to the top of a goal that is being inspected by specifying 0 zero
316. ure is called with arguments that make it sure to fail because of indexing In such cases the flow does not enter any clause box For each CALL port a new procedure box is created and is given e an invocation number that is one higher than that given for the most recent CALL port This allows to uniquely identify a procedure invocation and all its corresponding ports e a level that is one higher than that of its parent goal The displayed variable instantiations are the ones at call time i e before the head unifi cation of any clause EXIT When a clause of a predicate succeeds i e unification succeeded and all procedures called by the clause succeeded the flow gets out of the box by the EXIT port of both boxes only the EXIT port of the procedure box is traced When a procedure exits non deterministically and there are still other clauses to try on that procedure or one of its children goals has alternatives which could be resatisfied the EXIT port is traced with an asterisk EXIT When the last possibly matching clause of 117 LEAVE CALL RESUME Clause 1 REDO NEXT lt Clause 2 NEXT lt sss EXIT EXIT __ gt Clause n FAIL gt Figure 14 1 The box model a procedure is exited the exit is traced without asterisk This means that this procedure box will never be retried as there is no
317. ure that all its variables are instantiated at the end of computation will typically not suffer from floundering 17 3 Suspending Built Ins and the Suspend Library Basic ECL PS has two built in predicates whose behaviour includes suspending the sound negation built in 1 and the sound disequality predicate 2 Instead of succeeding or failing they will suspend when their arguments are insufficiently instantiated to make a decision For example 7 KOT SSS E X X There is 1 delayed goal Yes 0 00s cpu Here the system does not have enough information to decide whether the query is true or false The goal remains delayed and we have a case of floundering the ECL PS toplevel indicates this situation by printing a message about delayed goals at the end of the computation 166 However when the variable which was responsible for the suspension gets instantiated later the delayed goal will be resumed woken and either succeed fail or suspend again In the following example the disequality predicate initially suspends but wakes up later and succeeds or fails respectively K T 3 X 4 X 4 Yes 0 00s cpu f K T 3 X 3 No 0 00s cpu Further predicate implementations with the same behaviour delay until all arguments are ground can be found in the suspend library lib suspend In particular it implements all common arithmetic predicates plus the constraints defined by the Common Arithmetic Solver Interface see
318. uses and directives Unlike assert 1 it compiles a static procedure and so it can be used to compile a procedure which is dynamically created and then used as a static one For more information please refer to 10 ensure loaded File This predicate compiles the specified file if it has not been compiled yet or if it has been modified since the last compilation make This predicate recompiles all files that have been modified since their last compilation lib File This predicate is used to ensure that a specified library file is loaded If this library is not yet compiled the system will look in all directories in the library_path flag for a file with this name When the file is found it is compiled and the system remembers it current_compiled_file File Time Module This predicate returns on backtracking all files that have been compiled in this session together with the module from where the compilation was done and the modification time stamp of the file at the time it was compiled 1 An example of using this feature is the library ifdef 45 compiled file File Line This predicate allows to access the compiled file during the compi lation If it is called during the compilation it returns the name of the file being compiled and the current line in it If some I O operations are performed on the compiler stream it influences the compiler e g some procedures can be omitted and some compiled several times An example of its u
319. uspensions which then simply succeed The argument No of dif3 4 becomes instantiated to no as soon as all suspensions are woken and their matched pairs become identical eclipse 12 dif3 f A B f X Y Y N 192 Delayed goals compare_args A X no L1 Y compare_args B Y L1 N Y yes eclipse 13 dif3 f A B X Z Y N A a X b Y yes N N yes eclipse 14 dif3 f A B f X Z Y N A X B Z Yy N no yes Now we have a constraint predicate that can be used both to impose disequality on two terms and to query it For instance a condition if T1 T2 then X single else X double can be expressed as cond T1 T2 X dif3 T1 T2 Yes No cond_eval X Yes No cond_eval X yes _ gt X double cond_eval X _ no gt X single cond_eval X Yes No var Yes var No suspend cond_eval X Yes No 2 Yes No gt inst This example could be further extended e g to take care of shared variables occur check or propagating from the answer variable e g imposing equality on all matched argument pairs when the variable Y is instantiated We leave this as a rather advanced exercise to the reader 18 3 Waiting for other Constraints The constrained list in the suspend attribute is used for instance in generic predicates which have to be notified about the possible change of the state of a variable especially its unifyability with other terms Our exampl
320. ut the variable and with it the waking condition disappears and the goal may be left orphaned 17 8 Lower level Primitives Suspended goals are actually represented by a special opaque data type called suspension which can be explicitly manipulated under program control using the primitives defined in this section Although usually a suspended goal waits for some waking condition in order to be reactivated the primitives for suspension handling do not enforce this To provide maximum flexibility of use the functionalities of suspending and waking scheduling are separated from the trigger mechanisms that cause the waking 17 8 1 Suspensions and Suspension Lists A suspension represents a goal that is part of the resolvent Apart from the goal structure proper it holds information that is used for controlling its execution The components of a suspension are The goal structure A term representing the goal itself eg X gt Y The goal module The module from which the goal was called The goal priority The priority with which the goal will be scheduled when it becomes woken The state This indicates the current position of the suspension within the resolvent It is either suspended sleeping scheduled or executed dead Additional data E g debugging information Suspensions which should be woken by the same event are grouped together in a suspension list Suspension lists are either stored in an attribute of an attributed variable o
321. ute update setarg I Term NewArg will update the th argument of Term to be NewArg Its previous value will be restored on backtracking Libraries which define user programmable extensions like e g fd pl usually define predicates that modify the attribute or a part of it so that an explicit use of the setarg 3 predicate is not necessary 16 7 Attributed Variable Handlers An attributed variable is a variable with some additional information which is ignored by ordi nary object level system predicates Meta level operations on attributed variables are handled by extensions which know the contents of their attributes and can specify the outcome of each oper ation This mechanism is implemented using attributed variable handlers which are user defined predicates invoked whenever an attributed variable occurs in one of the predefined operations The handlers are specified in the attribute declaration meta_attribute Name HandlerList the second argument is a list of handlers in the form unify UnifyHandler test_unify TUHandler Handlers for operations which are not specified or those that are true O are ignored and never invoked If Name is an existing extension the specified handlers replace the current ones Whenever one of the specified operations detects an attributed variable it will invoke all handlers that were declared for it and each of them receives either the whole attributed variable or its particular attribute as argument
322. w suspended waiting for the remote tools to attach This is done by running the tktools program which is located with the other ECL PS executables As stated this program can be run on a different machine from the ECL PS session as long as the two are connected via a network such as the internet A connection window is then displayed as shown 23 ETE connecting tktools tons specify hostname and port number of ECUPSe session to connect to Use attach tools 0 from lib remote tools in ECUPSe session The same host and port fields as printed by the ECL PS session should be entered The default host field is localhost This will work if the remote tools are ran on the same machine as the ECL PS session Otherwise the full name of the host as given by attach_tools 0 needs to be entered ET All connecting tkteols ton specify hostname and port number of ECLPSe session to connect to Use attach tools 0 from lib remote_tools in ECLPSe session halborn icparc ic ac uk Typing return in the port field will start the attachment and with success the remote tools window see Figure 4 3 will be displayed The attach_tools 0 predicate will also return The user is not able to immediately interact directly with the remote tools as the ECL PS session is initially given control The user can use the ECL PS session as normal with the additional availability of the development tools For
323. w suspension list will be created schedule_suspensions Position Attribute Takes the suspension list on argument po sition Position within Attribute and schedule them for execution As a side effect the suspension list within Attribute is updated ie suspensions which are no longer useful are removed destructively See section 17 8 8 for more details on waking 178 17 8 7 Attaching Suspensions to Global Triggers A single suspension or a list of suspensions can be attached to a symbolic trigger by using attach_suspensions Trigger Susps A symbolic trigger can have an arbitrary name an atom 17 8 8 Scheduling Suspensions for Waking Suspended goals are woken by submitting at least one of the suspension lists in which they occur to the waking scheduler The waking scheduler which maintains a global priority queue inserts them into this queue according to their priority see figure 17 1 A suspension list can be passed to the scheduler by either of the predicates schedule_suspensions 1 for triggers or schedule_suspensions 2 for uder defined suspension lists A suspension which has been scheduled in this way and awaits its execution is called a scheduled suspension Note however that scheduling a suspension by means of schedule_suspensions 1 or sched ule_suspensions 2 alone does not implicitly start the waking scheduler Instead execution continues normally with the next goal in sequence after schedule_suspensions 1 2 The sche
324. w the stacks into an appropriate block 3 e g block big_goal X global_trail_overflow react_to_overflow In the debugger you can locate the overflow by jumping to a LEAVE port z command See chapter 19 for more details on memory usage 242 C 3 ECL PS Fatal Errors A fatal error cannot be caught by the user When they occur the system performs a warm restart The following fatal errors may be generated by ECL PSS Fatal error Out of memory no more swap space The available memory usually swap space on the computer has been used up either by the application or some external process Fatal error Internal error memory corrupted This signals an inconsistency in the system s internal data structures The reason can be either a bug in the ECL PS system itself or in an external predicate provided by the user C 4 User Defined Events User defined events should use atomic event names rather than numbers See set_event_handler 2 243 244 Appendix D ECL PS Command Line Options The ECL PS system has several parameters which may be specified on the command line at invocation time They are as follows b bootfile Compile the file bootfile before starting the session Multiple b options are allowed The file name is expected to be in the operating system s syntax The file is processed by ensure_loaded 1 i e it can be a precompiled file or a source file and file extensions are added as specif
325. was admissible 2nd clause of unify_enum 2 eclipse 2 module enum warning creating a new module in module enum enum 3 user meta_attribute enum unify unify_enum 2 print print_enum 2 import setarg 3 from sepia_kernel unify_enum Term Attribute unify_enum _ Attr ANY VAR var Attr Ignore if no attribute for this extension unify_enum Term Attr compound Attr unify_term_enum Term Attr unify_term_enum Value enum ListY nonvar Value The attributed variable was instantiated NONVAR META memberchk Value ListY unify_term_enum Y AttrY AttrX gt unify_enum_enum Y AttrX AttrY unify_enum_enum _ AttrX AttrY var AttrY no attribute for this extension VAR META x x x AttrX AttrY share the attribute 161 unify_enum_enum Y enum ListX AttrY nonvar AttrY META META AttrY enum ListY intersection ListX ListY ListXY ListXY Val gt Y Val ListXY setarg 1 AttrY ListXY dis print_enum enum List Attr gt Attr List user compiled traceable 1188 bytes in 0 03 seconds yes enum 4 Afenum yellow blue white green Bfenum orange blue red yellow A B A blue yellow yes enum 5 Afenum yellow blue white green B enum orange blue red black A B blue yes enum 6 Afenum yellow blue white green white
326. ws to check whether a module is locked 65 66 Chapter 8 Arithmetic Evaluation 8 1 Built Ins to Evaluate Arithmetic Expressions Unlike other languages Prolog usually interprets an arithmetic expression like 3 4 as a compound term with functor and two arguments Therefore a query like 3 4 7 fails because a compound term does not unify with a number The evaluation of an arithmetic expression has to be explicitly requested by using one of the built ins described below The basic predicate for evaluating an arithmetic expression is is 2 Apart from that only the 6 arithmetic comparison predicates evaluate arithmetic expressions automatically Result is Expression Expression is a valid arithmetic expression and Result is an uninstan tiated variable or a number The system evaluates Expression which yields a numeric result This result is then unified with Result An error occurs if Expression is not a valid arithmetic expression or if the evaluated value and Result are of different types Expri lt Expr2 succeeds if after evaluation and type coercion Exprl is less than Expr2 Expr1 gt Expr2 succeeds if after evaluation and type coercion Expr1 is greater or equal to Expr2 Expri gt Expr2 succeeds if after evaluation and type coercion Exprl is greater than Expr2 Expri lt Expr2 succeeds if after evaluation and type coercion Exprl is less or equal to Expr2 Expri Expr2 succeeds if after evaluation and typ
327. xed This option affects the triggering heuristics of the garbage collector together with the gc_interval setting The fixed policy minimises space consumption set_flag gc_interval Nbytes Specify how often the collector is invoked Roughly Nbytes is the number of bytes that your program can use up before a garbage collection is triggered There may be programs that create lots of useful lists and structures while leaving few garbage This will cause the garbage collector to run frequently while reclaiming little provided that the underlying operating system supports this 200 space If you suspect this you should call statistics 0 and check the garbage ratio If it is very low say below 50 it may make sense to increase the gc_interval thus reducing the number of garbage collections This is normally only necessary when the gc_policy is set to fixed With gc_policy set to adaptive the collection intervals will be adjusted automatically garbage_collect Request an immediate collection only if enabled The use of this predicate should be restricted to situations where the automatic triggering performs badly It should then be inserted in a place where you know for sure that you have just created a lot of garbage eg before the tail recursive call in something like cycle OldState transform OldState NewState long computation l garbage_collect OldState is obsolete cycle NewState statistics gc_number
328. y and Functor of Structures 5 1 3 Printing Structures 5 1 4 Inheritance 5 1 5 Visibility 5 2 Loop Iterator Constructs 5 2 1 Examples 5 3 Array Notation 5 3 1 Implementation Note 5 4 The String Data Type 5 4 1 5 4 2 Builtin Support for Strings 5 4 3 Quoted lists 5 5 Matching Clauses 5 6 Soft CUb o The Compiler 6 1 Program Source 6 2 Procedure Types 6 3 Compiler Modes 6 4 Compiler Input 6 5 Module Compilation 6 6 Mode Declarations 6 7 Inlining 6 8 Compiler Pragmas 6 9 Writing Efficient Code 6 10 Compiling and loading object code 6 10 1 Restrictions 6 11 Abstract Code Listing Module System 7 1 Basics Invoking display matrix tool interactively 4 2 Using the development tools in applications Using the Development tools in the Tcl Tk Embedding Interface 4 2 2 Using the Remote Development Tools Choosing The Appropriate Data Type 0 00008 7 1 1 Purpose of Modules viola 7 1 2 What is under Visibility Control o 7 13 What Modules are There 2 20 0 0 0000002 eee ee 72 Getting Started s 22 4426 4b edd eee tae dee es SR RAO eR ee as 7 2 1 Creating a Module e 7 2 2 Exporting 19 19 21 21 21 22 27 27 28 28 28 28 29 29 32 35 37 37 37 39 39 39 40 43 43 43 44 45 46 46 47 48
329. y default and waits for a sequence of clauses Each of the clauses is terminated by a full stop If the fullstop is omitted the system just sits waiting because it supposes the clause is not terminated If you omit the stop by accident simply type it in on the following line and then proceed to type in the program clauses each followed by a full stop and carriage return To return to the top level prompt type CTRL D UNIX CTRL Z RETURN Windows or enter the atom end_of_file followed by fullstop and RETURN For example eclipse 1 user father abraham isaac father isaac jacob father jacob joseph ancestor X Y father X Y ancestor X Y ancestor X Z ancestor Z Y D user compiled traceable 516 bytes in 0 00 seconds yes eclipse 2 The two predicates father 2 and ancestor 2 are now compiled and can be used 3 5 5 Executing a query Once a set of clauses has been compiled it may be queried in the usual Prolog manner If there are no uninstantiated variables in the query the system replies yes or no and prompts for another query for example eclipse 1 father jacob joseph yes eclipse 2 If there are uninstantiated variables in the query the system will attempt to find an instantiation of them which will satisfy the query and if successful it will display one such instantiation It will then wait for a further instruction either a lt CR gt newline or return
330. yed goals may be woken at once The order of executing woken suspended goals does not necessarily correspond to the order of their suspending It is in fact determined by their priorities and is implementation dependent within the same priority group 181 The waking process never interrupts unifications and or a sequence of simple goals Simple goals are a subset of the built ins and can be recognised by their call_ type flag as returned by get_flag 3 simple goals having the type external Note also that some predicates e g is 2 are normally in line expanded and thus simple but can be regular when inlining is suppressed e g by the pragma noexpand directive ECL PS treats simple predicates including unification always as a block Delayed goals are therefore woken only at the end of a successful unification and or a sequence of simple goals If a suspending variable is bound in a simple goal the suspended goals are woken only at the end of the last consecutive simple goal or at the clause end If the clause contains simple goals at the beginning of its body they are considered part of the head extended head and if a suspending variable is bound in the head unification or in a simple predicate in the extended head the corresponding delayed goals are woken at the end of the extended head A cut is also considered a simple goal and is therefore always executed before waking any pending suspended goals This is important to know especially in
331. ys Curly brackets A A always Subscripted variable X subscript X default Subscripted struct SL subscript S default Declared structure f with f default Attributed variable X with attributes X default Variable functor XC apply X optional Here A B stands for arbitrary terms X for a variable S for a compound term in canoncial syntax f for an arbitrary functor and the ellipsis for a comma separated sequence of arbitrary terms 230 Appendix B Operators The following table summarises the predefined global operators in ECL PS They can be redefined or erased on a per module basis by hiding them with a user defined local operator using op 3 Prec Assoc Operators 1200 xfx Sse Sy Pay El 1200 fx 1190 fy help 1190 fx delay 1180 fx gt 1170 xfx else 1160 fx if 1150 xfx then 1100 xfy Es do 1050 xfy gt 1050 xfx except from 1050 fy import reexport 1000 xfy 1000 fy abolish demon dynamic export global listing local mode nospy parallel skipped spy traceable unskipped untraceable 900 fy not once 700 xfx lt lt lt tb tb Nas lt lt gt gt lt lt gt is 650 xfx of with 600 xfy 600 xfx 500 FER D A VI 500 ae H 400 yfx I lt lt gt gt 300 xfx
Download Pdf Manuals
Related Search
Related Contents
Capítulo 1 - PPGEE - Universidade Federal de Minas Gerais Copyright © All rights reserved.
Failed to retrieve file