TEACH SIMPLEMATHS Aaron Sloman Oct 2011 Based on older teach files Familiar Simple Mathematical Operations in Pop11 An Introduction for experienced programmers CONTENTS - (Use g to access required sections) -- Introduction -- Pop11 as a stack-based desk calculator -- Division can sometimes produce surprises -- There are also complex (imaginary) numbers with their own format -- Looping over numbers -- Adding tracing information to a numerical procedure -- More things to do -- Introduction ------------------------------------------------------- Pop11/Pop-11/pop11 is an AI language whose origins go back to work by Robin Popplestone around 1969. There is information about its origins in POP-11 Comes of Age: The Advancement of an AI Programming Language, Editor James A.D.W. Anderson, Ellis Horwood, Chichester, 1989, That book is now out of print. The online Pop11 primer (version 4 October 2011) gives a more detailed overview for readers with programming experience. If are are reading this in the Poplog editor Ved or XVed, you can access the primer with the command ENTER teach primer RETURN It is also available on the internet HTML http://www.cs.bham.ac.uk/research/projects/poplog/primer/ Printable PDF http://www.cs.bham.ac.uk/research/projects/poplog/primer.pdf (About 287 printed pages -- may vary with edits) Printable PDF 2 pages per sheet http://www.cs.bham.ac.uk/research/projects/poplog/primer2.pdf (About 144 printed pages -- may vary with edits) Like Common Lisp and several other AI languages, Pop11 provides considerable support for numerical entities and operations on them. The entities include small integers, big integers (size limit depends on available memory), short and long floating point numbers (referred to as "reals" in Pop11), indefinite precision ratios, and complex (imaginary) numbers. There is also a Pop11 interface to the BLAS and LAPACK linear algebra packages produced by David Young at Sussex University, and included with Poplog as part of the Popvision library. This supplies many of the features of packages like MATLAB, easily combined with other AI tools. This teach file introduces a tiny subset of those mathematical capabilities for new users looking for some familiar constructs. The ideas will be presented mainly in the form of examples that can be compiled and run in the editor, then modified, then re-run, etc. More detailed information is available in TEACH files, HELP files and REF files, some of which are referred to at the end, and in the Primer. If you have not yet looked at you may find this short introduction to the editor useful: ENTER teach minived RETURN (or put the editor cursor after "teach" and type ESC h). -- Pop11 as a stack-based desk calculator ----------------------------- Add some numbers, using '=>' to print out the result: (use ESC d on this line): 10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25 => Your output.p file should show this: ** 280 Try a numerical expression using different operators: 10+11*12 => ** 142 spaces between numerals and operator symbols make no difference: 10 + 11 * 12 => ** 142 What should this do. Try it? (10+11)*12 => You can include decimals (reals, floats) instead of only integers: 10+11*12.0 => ** 142.0 3.6 + 4.2 => ** 7.8 If a non-integer is involved, its type takes over. Or this (10 + 11)*12.0 => -- Division can sometimes produce surprises --------------------------- 12/4 => ** 3 This one is not exact, so it produces a 'ratio' 12 5ths: 12/5 => ** 12_/5 So does this 24/10 => ** 12_/5 Ratios are automatically reduced by dividing numerator and denominator by highest common factor. In that case 2. 3 + 4/5 => ** 19_/5 Try some others. If a decimal is involved, it dominates: 3.0 + 4/5 => ** 3.8 or the other way round: 4/5 + 3.0 => ** 3.8 -- There are also complex (imaginary) numbers with their own format --- The sqrt (square root) function may produce some surprises: sqrt(100) => ** 10.0 sqrt(-100) => ** 0.0_+:10.0 That's a complex number with real part 0.0 and 'imaginary part' 10. The square root of -1 is generally represented is "i" in maths, but pop11 represents as (in effect) 0.0 + i*1.0 sqrt(-1) => ** 0.0_+:1.0 -- Looping over numbers ----------------------------------------------- Our original expression 10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25 => can be expressed as a loop, using a variable e.g. num, to take the successive values and then repeatedly add them to another variable, total, which starts from 0: vars num, total; 0 -> total; for num from 10 by 1 to 25 do total + num -> total endfor; total => Mark those four lines using Mark first: F1 (or ESC m) and Mark Last: F2 (or esc M) Then compile the range (CTRL-d). We can create a pop11 procedure (sometimes called a function) that will do that sort of thing for any start number and any increment, added repeatedly until some target is reached or passed: define add_range(start, increment, target) -> total; 0 -> total; for start from start by increment to target do total + start -> total endfor; enddefine; Mark that range (F1, and F2) then compile it (CTRL-d). Now test it, first with our original sum: add_range(10, 1, 25) => ** 280 same result as before. Will this give a bigger or a smaller total? add_range(10, 2, 25) => Try other values. Try defining a procedure multiply_range(start, increment, target) that repeatedly increments a multiplier and produces a result. You can test it on things like multiply_range(5, 1 8): 5*6*7*8 => ** 1680 Does it give the right answer for this: 10*11*12*13*14*15*16*17*18*19*20*21*22*23*24*25 => i.e. ** 42744736671436800000 -- Adding tracing information to a numerical procedure ---------------- If you wish to know what add_range is doing each time round the loop you can easily make it print its values, by constructing a list of information to be printed out after the addition is done. Use the fact that a list like this [start ^start, total ^total] => Will print out in the format [start , total ] So try compiling and testing this: define add_range(start, increment, target) -> total; 0 -> total; for start from start by increment to target do total + start -> total; [start ^start, total ^total] => endfor; enddefine; What should these print? add_range(2, 2, 10) => add_range(-2, 2, 10) => This may surprise you: add_range(-10, 0.5, 10) => Try some others. If you wish you can add another print instruction before the addition is done in the loop. The tracing instructions can be commented out by putting three semi-colons before the instructions. E.g. ;;; [start ^start, total ^total] => In pop11 anything after ';;;' to the end of the line is ignored. Like several other programming languages Pop11 also allows /* ... */ as comments, stretching over several lines, e.g. /* ;;; This can be enabled for tracing purposes [start ^start, total ^total] => */ You can mark (F1, F2) and compile (ESC -d) that but nothing will happen. -- More things to do -------------------------------------------------- Now try TEACH * ARITH Put the cursor on the asterisk, and type ESC h, or do ENTER teach arith RETURN For revision on using the editor try TEACH * ESSENTIALKEYS TEACH * MINIVED The HELP * MATH file gives you the following contents: MATHEMATICAL OPERATIONS AND PROCEDURES IN POP-11 -- Types of numbers available in POP-11 -- Recogniser procedures -- Arithmetical operators -- Comparison procedures (predicates) -- Operations on Ratios -- Operations on Complex numbers -- Bitwise operations -- Floating point utilities -- Trigonometric and other utilities -- Representation and efficiency -- Fast integer procedures -- Global variables and constants -- LIB FLOAT_PARAMETERS -- LIB INT_PARAMETERS There's lots more. If you are either using a linux machine locally, or using XMing from a windows machine to connect to this, you can try out some of Pop-11's graphical facilities, as demonstrated here, using numerical coordinates to control what is drawn: TEACH * GSTART Some standard graphical stuff, e.g. drawing lines. TEACH * FACES How to make faces out of coloured blobs. See also http://www.cs.bham.ac.uk/research/projects/poplog/examples --- $usepop/pop/teach/simplemaths --- Copyright University of Birmingham 2011. All rights reserved.