Elements of Functional Computing

Total Page:16

File Type:pdf, Size:1020Kb

Elements of Functional Computing Elements of Functional Computing Dan R. Ghica 2015 Contents 1 Introduction 4 1.1 Basic concepts . .4 1.2 Programming the machine, a historical outlook . .4 1.3 Abstraction . .5 1.4 Functional programming: a historical outlook . .6 2 \Formal" programming: rewrite systems 8 2.0.1 \Theorems" . .9 2.1 Further reading . 10 3 Starting with OCaml/F# 11 3.1 Predefined types . 11 3.2 Toplevel vs. local definition . 13 3.3 Type errors . 13 3.4 Defined types: variants . 14 4 Functions 15 4.1 Pattern-matching and if . 16 5 Multiple arguments. Polymorphism. Tuples. 20 5.1 Multiple arguments . 20 5.2 Polymorphism . 20 5.3 Notation . 21 5.4 Tuples . 22 5.5 More on pattern-matching . 23 5.6 Some comments on type . 24 6 Isomorphism of types 25 6.1 Quick recap of OCaml syntax . 26 6.2 Further reading . 26 7 Lists 27 7.1 Arrays versus lists . 27 7.2 Getting data from a list. 28 8 Recursion. 30 8.0.1 Sums . 30 8.0.2 Count . 31 8.1 Creating lists . 32 8.2 Further reading . 34 8.3 More on patterns . 34 1 9 Case study: graph search 37 9.1 Graph search . 37 9.2 Running and debugging . 41 10 Structural induction 47 10.1 Examples for structural induction . 49 10.1.1 Example . 49 10.1.2 Example . 49 10.1.3 Example . 50 11 Search and sort 51 11.1 Searching and filtering . 51 11.2 Quick-sort . 52 11.3 Selection sort . 53 11.4 Performance of quick-sort . 55 11.5 Mergesort . 56 11.6 Questions . 60 12 Correctness of sorting 61 13 Number representations 65 13.1 Natural numbers . 65 13.2 Arbitrary numeral systems . 68 13.3 Canonical representation . 69 13.4 Questions . 70 14 Data types 72 14.1 Syntax of Ocaml types . 72 14.2 Handling errors through data types . 73 14.3 Integers . 74 14.4 Rationals . 75 14.5 Real numbers . 75 14.6 Floating point . 76 14.7 An application: logistic map . 78 15 Introduction to complexity 81 15.1 Profiling . 84 15.2 Tail recursion . 85 16 Arrays and imperative programming 87 16.1 Searching and sorting . 90 17 Binary trees as a data types 94 17.1 Tree traversals . 96 17.1.1 Complexity of traversal . 98 17.2 Dictionaries as binary search trees . 100 17.2.1 Search . 101 17.3 Search tree manipulation . 101 17.3.1 Insertion . 101 17.3.2 Deletion . 103 17.3.3 Balancing . 105 17.4 Expression evaluation . 108 17.4.1 Logic . 108 17.4.2 Arithmetic . 109 17.5 Arithmetic-logic expressions . 109 2 18 Queues 111 18.1 Naive implementation . 112 18.2 Banker's queues . 113 18.2.1 Amortised complexity . 115 18.3 Interaction nets . 115 18.4 Imperative queues . 117 3 1 Introduction 1.1 Basic concepts Computer Science (CS) studies computation and information, both from a theoretical point of view and for applications in constructing computer systems. It is perhaps not very helpful to try and define these two basic, and deeply connected, notions of \computation" and \information", but it is perhaps helpful to talk about some properties they enjoy. Information is what is said to be exchanged in the course of communication. Information is said to be used to represent data, knowledge or ideas. A wonderful example of information is the DNA: it is a pattern of molecules that defines the formation and development of an organism without any need for a conscious or insightful mind. This lack of insight is essential for the understanding of computation, which is the deliberate, automated, mechanical processing or transformation of information. So the questions that CS answers are commonly about what can be computed and how it can be computed. The answers to these questions can be both qualitative, indicating that something can/cannot be computed, and quantitative, indicating how much of a certain resource (time, space, energy) must be consumed in order to perform a computation. The engineering and design side of CS is concerned with how to improve quantitative measures of computation. Computation is carried out by a mindless, uninsightful program executed by a machine. The machines can be either physical (case in which they are called computers) or virtual (a machine which is in some logical sense running on top of another machine) or abstract (a theoretical con- traption which embodies certain ideals of what can be computed). Programs are always written in a language which needs to be well-defined in at least two ways: Syntax. Just like English, or any other natural language, it is important to distinguish between well-formed phrases and gibberish. Note that to make this distinction it is not important to understand the meaning, just the rules of what a well-formed phrase looks like. Consider the opening stanza of the poem Jabberwocky by Lewis Caroll: 'Twas brillig, and the slithy toves Did gyre and gimble in the wabe; All mimsy were the borogoves, And the mome raths outgrabe. It has the syntactic form of English despite using nonsensical made-up words. Programming languages, unlike natural languages, have much stricter and clearly defined syntax. A good programming language has no ambiguity as to whether a phrase is legal or not, and if it is legal as to what its syntactic structure is. In a program a single-character typo can usually render a program illegal. Semantics. If syntax is concerned with what a meaningful program should look like, in semantics the concern is what the program actually means. Just like the syntax of a programming language must have a complete, unambiguous specification so its semantics must define com- pletely and unambiguously what each program means. Defining, or even just understanding, the syntax and semantics of languages is an advanced topic with which we will not deal in this module. Instead we will focus on the activity of writing programs, i.e. programming. 1.2 Programming the machine, a historical outlook Programming is actually a very old activity. The oldest recognisable device used to perform calculations, the abacus, is known since 2400 BCE, although all its calculations are manual. The first mechanical calculators were used to perform astrological calculations, for example the astrolabe, which was invented around 150 BCE. More modern efforts are Pascal's 1642 calculating machine and Leibniz's Stepped Reckoner from 1672. The latter was made into a commercial product, the Arithmometer by C.X. Thomas in 1820. Perhaps the most famous was Babbage's analytical engine, a design continuously improved from 4 1833 until 1871, the year of Babbage's death. Notably, its programs were stored on punchcards and it had control features similar to modern computers. Ada Lovelace is officially the world's first computer programmer, having written a program for the analytical engine to compute a sequence of numbers known as Bernoulli numbers. The first electronic computers appeared before and during World War II. Replacing mechanical components with electronic circuits allowed higher speeds and smaller sizes. Variously claiming to be the first computer are Zuse's Z3 (Germany, 1941), the Atanasoff-Berry computer (USA, 1937) or the Colossus (UK, 1943). ENIAC (US, 1946) was the first computer to resemble in internal structure today's computers. It executed a few thousands instructions per second, it weighed 27 tons and it consumed 150 kW of power. For comparison, a smartphone contains a computer which.
Recommended publications
  • C++ Programming: Program Design Including Data Structures, Fifth Edition
    C++ Programming: From Problem Analysis to Program Design, Fifth Edition Chapter 5: Control Structures II (Repetition) Objectives In this chapter, you will: • Learn about repetition (looping) control structures • Explore how to construct and use count- controlled, sentinel-controlled, flag- controlled, and EOF-controlled repetition structures • Examine break and continue statements • Discover how to form and use nested control structures C++ Programming: From Problem Analysis to Program Design, Fifth Edition 2 Objectives (cont'd.) • Learn how to avoid bugs by avoiding patches • Learn how to debug loops C++ Programming: From Problem Analysis to Program Design, Fifth Edition 3 Why Is Repetition Needed? • Repetition allows you to efficiently use variables • Can input, add, and average multiple numbers using a limited number of variables • For example, to add five numbers: – Declare a variable for each number, input the numbers and add the variables together – Create a loop that reads a number into a variable and adds it to a variable that contains the sum of the numbers C++ Programming: From Problem Analysis to Program Design, Fifth Edition 4 while Looping (Repetition) Structure • The general form of the while statement is: while is a reserved word • Statement can be simple or compound • Expression acts as a decision maker and is usually a logical expression • Statement is called the body of the loop • The parentheses are part of the syntax C++ Programming: From Problem Analysis to Program Design, Fifth Edition 5 while Looping (Repetition)
    [Show full text]
  • Compiler Construction Assignment 3 – Spring 2018
    Compiler Construction Assignment 3 { Spring 2018 Robert van Engelen µc for the JVM µc (micro-C) is a small C-inspired programming language. In this assignment we will implement a compiler in C++ for µc. The compiler compiles µc programs to java class files for execution with the Java virtual machine. To implement the compiler, we can reuse the same concepts in the code-generation parts that were done in programming assignment 1 and reuse parts of the lexical analyzer you implemented in programming assignment 2. We will implement a new parser based on Yacc/Bison. This new parser utilizes translation schemes defined in Yacc grammars to emit Java bytecode. In the next programming assignment (the last assignment following this assignment) we will further extend the capabilities of our µc compiler by adding static semantics such as data types, apply type checking, and implement scoping rules for functions and blocks. Download Download the Pr3.zip file from http://www.cs.fsu.edu/~engelen/courses/COP5621/Pr3.zip. After unzipping you will get the following files Makefile A makefile bytecode.c The bytecode emitter (same as Pr1) bytecode.h The bytecode definitions (same as Pr1) error.c Error reporter global.h Global definitions init.c Symbol table initialization javaclass.c Java class file operations (same as Pr1) javaclass.h Java class file definitions (same as Pr1) mycc.l *) Lex specification mycc.y *) Yacc specification and main program symbol.c *) Symbol table operations test#.uc A number of µc test programs The files marked ∗) are incomplete. For this assignment you are required to complete these files.
    [Show full text]
  • PDF Python 3
    Python for Everybody Exploring Data Using Python 3 Charles R. Severance 5.7. LOOP PATTERNS 61 In Python terms, the variable friends is a list1 of three strings and the for loop goes through the list and executes the body once for each of the three strings in the list resulting in this output: Happy New Year: Joseph Happy New Year: Glenn Happy New Year: Sally Done! Translating this for loop to English is not as direct as the while, but if you think of friends as a set, it goes like this: “Run the statements in the body of the for loop once for each friend in the set named friends.” Looking at the for loop, for and in are reserved Python keywords, and friend and friends are variables. for friend in friends: print('Happy New Year:', friend) In particular, friend is the iteration variable for the for loop. The variable friend changes for each iteration of the loop and controls when the for loop completes. The iteration variable steps successively through the three strings stored in the friends variable. 5.7 Loop patterns Often we use a for or while loop to go through a list of items or the contents of a file and we are looking for something such as the largest or smallest value of the data we scan through. These loops are generally constructed by: • Initializing one or more variables before the loop starts • Performing some computation on each item in the loop body, possibly chang- ing the variables in the body of the loop • Looking at the resulting variables when the loop completes We will use a list of numbers to demonstrate the concepts and construction of these loop patterns.
    [Show full text]
  • 7. Control Flow First?
    Copyright (C) R.A. van Engelen, FSU Department of Computer Science, 2000-2004 Ordering Program Execution: What is Done 7. Control Flow First? Overview Categories for specifying ordering in programming languages: Expressions 1. Sequencing: the execution of statements and evaluation of Evaluation order expressions is usually in the order in which they appear in a Assignments program text Structured and unstructured flow constructs 2. Selection (or alternation): a run-time condition determines the Goto's choice among two or more statements or expressions Sequencing 3. Iteration: a statement is repeated a number of times or until a Selection run-time condition is met Iteration and iterators 4. Procedural abstraction: subroutines encapsulate collections of Recursion statements and subroutine calls can be treated as single Nondeterminacy statements 5. Recursion: subroutines which call themselves directly or indirectly to solve a problem, where the problem is typically defined in terms of simpler versions of itself 6. Concurrency: two or more program fragments executed in parallel, either on separate processors or interleaved on a single processor Note: Study Chapter 6 of the textbook except Section 7. Nondeterminacy: the execution order among alternative 6.6.2. constructs is deliberately left unspecified, indicating that any alternative will lead to a correct result Expression Syntax Expression Evaluation Ordering: Precedence An expression consists of and Associativity An atomic object, e.g. number or variable The use of infix, prefix, and postfix notation leads to ambiguity An operator applied to a collection of operands (or as to what is an operand of what arguments) which are expressions Fortran example: a+b*c**d**e/f Common syntactic forms for operators: The choice among alternative evaluation orders depends on Function call notation, e.g.
    [Show full text]
  • Repetition Structures
    24785_CH06_BRONSON.qrk 11/10/04 9:05 M Page 301 Repetition Structures 6.1 Introduction Goals 6.2 Do While Loops 6.3 Interactive Do While Loops 6.4 For/Next Loops 6.5 Nested Loops 6.6 Exit-Controlled Loops 6.7 Focus on Program Design and Implementation: After-the- Fact Data Validation and Creating Keyboard Shortcuts 6.8 Knowing About: Programming Costs 6.9 Common Programming Errors and Problems 6.10 Chapter Review 24785_CH06_BRONSON.qrk 11/10/04 9:05 M Page 302 302 | Chapter 6: Repetition Structures The applications examined so far have illustrated the programming concepts involved in input, output, assignment, and selection capabilities. By this time you should have gained enough experience to be comfortable with these concepts and the mechanics of implementing them using Visual Basic. However, many problems require a repetition capability, in which the same calculation or sequence of instructions is repeated, over and over, using different sets of data. Examples of such repetition include continual checking of user data entries until an acceptable entry, such as a valid password, is made; counting and accumulating running totals; and recurring acceptance of input data and recalculation of output values that only stop upon entry of a designated value. This chapter explores the different methods that programmers use to construct repeating sections of code and how they can be implemented in Visual Basic. A repeated procedural section of code is commonly called a loop, because after the last statement in the code is executed, the program branches, or loops back to the first statement and starts another repetition.
    [Show full text]
  • Foundations of Computer Science I
    Foundations of Computer Science I Dan R. Ghica 2014 Contents 1 Introduction 2 1.1 Basic concepts . .2 1.2 Programming the machine, a historical outlook . .2 1.3 Abstraction . .3 1.4 Functional programming: a historical outlook . .4 2 \Formal" programming: rewrite systems 6 2.0.1 \Theorems" . .7 2.1 Further reading . .8 3 Starting with OCaml/F# 9 3.1 Predefined types . .9 3.2 Toplevel vs. local definition . 11 3.3 Type errors . 11 3.4 Defined types: variants . 12 4 Functions 13 4.1 Pattern-matching and if . 14 5 Multiple arguments. Polymorphism. Tuples. 18 5.1 Multiple arguments . 18 5.2 Polymorphism . 18 5.3 Notation . 19 5.4 Tuples . 20 5.5 More on pattern-matching . 21 5.6 Some comments on type . 22 6 Isomorphism of types 23 6.1 Quick recap of OCaml syntax . 24 6.2 Further reading . 24 7 Lists 25 7.1 Arrays versus lists . 25 7.2 Getting data from a list. 26 8 Recursion. 28 8.0.1 Sums . 28 8.0.2 Count . 29 8.1 Creating lists . 30 8.2 Further reading . 32 8.3 More on patterns . 32 1 1 Introduction 1.1 Basic concepts Computer Science (CS) studies computation and information, both from a theoretical point of view and for applications in constructing computer systems. It is perhaps not very helpful to try and define these two basic, and deeply connected, notions of \computation" and \information", but it is perhaps helpful to talk about some properties they enjoy. Information is what is said to be exchanged in the course of communication.
    [Show full text]
  • An Introduction to Programming in Simula
    An Introduction to Programming in Simula Rob Pooley This document, including all parts below hyperlinked directly to it, is copyright Rob Pooley ([email protected]). You are free to use it for your own non-commercial purposes, but may not copy it or reproduce all or part of it without including this paragraph. If you wish to use it for gain in any manner, you should contact Rob Pooley for terms appropriate to that use. Teachers in publicly funded schools, universities and colleges are free to use it in their normal teaching. Anyone, including vendors of commercial products, may include links to it in any documentation they distribute, so long as the link is to this page, not any sub-part. This is an .pdf version of the book originally published by Blackwell Scientific Publications. The copyright of that book also belongs to Rob Pooley. REMARK: This document is reassembled from the HTML version found on the web: https://web.archive.org/web/20040919031218/http://www.macs.hw.ac.uk/~rjp/bookhtml/ Oslo 20. March 2018 Øystein Myhre Andersen Table of Contents Chapter 1 - Begin at the beginning Basics Chapter 2 - And end at the end Syntax and semantics of basic elements Chapter 3 - Type cast actors Basic arithmetic and other simple types Chapter 4 - If only Conditional statements Chapter 5 - Would you mind repeating that? Texts and while loops Chapter 6 - Correct Procedures Building blocks Chapter 7 - File FOR future reference Simple input and output using InFile, OutFile and PrintFile Chapter 8 - Item by Item Item oriented reading and writing and for loops Chapter 9 - Classes as Records Chapter 10 - Make me a list Lists 1 - Arrays and simple linked lists Reference comparison Chapter 11 - Like parent like child Sub-classes and complex Boolean expressions Chapter 12 - A Language with Character Character handling, switches and jumps Chapter 13 - Let Us See what We Can See Inspection and Remote Accessing Chapter 14 - Side by Side Coroutines Chapter 15 - File For Immediate Use Direct and Byte Files Chapter 16 - With All My Worldly Goods..
    [Show full text]
  • White-Box Testing
    4/17/2018 1 CS 4311 LECTURE 11 WHITE-BOX TESTING Outline 2 Program Representation Control Flow Graphs (CFG) Coverage Criteria Statement Branch Condition Path Def-Use 1 4/17/2018 Thursday’s Riddle 3 White-Box Testing 4 2 4/17/2018 Program representation: Control flow graphs 5 Program representation: Basic blocks 6 A basic block in program P is a sequence of consecutive statements with a single entry and a single exit point. Block has unique entry and exit points. Control always enters a basic block at its entry point and exits from its exit point. There is no possibility of exit or a halt at any point inside the basic block except at its exit point. The entry and exit points of a basic block coincide when the block contains only one statement. 3 4/17/2018 Basic blocks: Example 7 Reverse Engineering: What does this code do? Example: Computing x raised to y Basic blocks: Example (contd.) 8 Basic blocks 4 4/17/2018 Control Flow Graph (CFG) 9 A control flow graph (CFG) G is defined as a finite set N of nodes and a finite set E of edges. An edge (i, j) in E connects two nodes ni and nj in N. We often write G= (N, E) to denote a flow graph G with nodes given by N and edges by E. Control Flow Graph (CFG) 10 In a flow graph of a program, each basic block becomes a node and edges are used to indicate the flow of control between blocks Blocks and nodes are labeled such that block bi corresponds to node ni.
    [Show full text]
  • Basic Syntax of Switch Statement in Php
    Basic Syntax Of Switch Statement In Php Sometimes unexacting Nichols outride her assentors pharmacologically, but unforgotten Wilmer locating conscientiously or trouncing biliously. Sheff is philologically developing after moving Simeon foretokens his malarkey unreasoningly. Drifting Sanders scuppers: he undercook his hypnology forehanded and extenuatingly. Opening and variable is for running code should never use ranges for more than one condition for example above given program run error will publish the usa, of switch statement php syntax of strlen Both are dead to catch values from input fields, not defects. Use real tabs and not spaces, we define everything for the evaluations with open late close curly braces. Case construct both an indexed array definitions onto several lines should be evaluated and basic syntax of switch statement in php? Hyphens should separate words. You should typically use the escaped, but she the sharing of those rules. Also, Django Monitoring, a template engine repair the PHP programming language. Case checks for luggage and numbers. Php allows php program easier to install this site or download apache hadoop, we can be declared after entering the php syntax. How classes are named. We use cookies to improve user experience, no actual PHP code runs on your computer. It shall load with a letter the underscore. Ryan wenderlich by wrapping the field of each case statements then the syntax of. As direct general snapshot, we are does the compiler that event have seed what we anticipate looking for, chess are much convenient control to package values and functions specific patient a class. The basic understanding is only specify blocks till it will have a basic syntax of switch statement in php is indented by easing common loops.
    [Show full text]
  • 6Up with Notes
    Notes CSCE150A Computer Science & Engineering 150A Problem Solving Using Computers Lecture 05 - Loops Stephen Scott (Adapted from Christopher M. Bourke) Fall 2009 1 / 1 [email protected] Chapter 5 CSCE150A 5.1 Repetition in Programs 5.2 Counting Loops and the While Statement 5.3 Computing a Sum or a Product in a Loop 5.4 The for Statement 5.5 Conditional Loops 5.6 Loop Design 5.7 Nested Loops 5.8 Do While Statement and Flag-Controlled Loops 5.10 How to Debug and Test 5.11 Common Programming Errors 2 / 1 Repetition in Programs CSCE150A Just as the ability to make decisions (if-else selection statements) is an important programming tool, so too is the ability to specify the repetition of a group of operations. When solving a general problem, it is sometimes helpful to write a solution to a specific case. Once this is done, ask yourself: Were there any steps that I repeated? If so, which ones? Do I know how many times I will have to repeat the steps? If not, how did I know how long to keep repeating the steps? 3 / 1 Notes Counting Loops CSCE150A A counter-controlled loop (or counting loop) is a loop whose repetition is managed by a loop control variable whose value represents a count. Also called a while loop. 1 Set counter to an initial value of 0 2 while counter < someF inalV alue do 3 Block of program code 4 Increase counter by 1 5 end Algorithm 1: Counter-Controlled Loop 4 / 1 The C While Loop CSCE150A This while loop computes and displays the gross pay for seven employees.
    [Show full text]
  • A Short Introduction to Ocaml
    Ecole´ Polytechnique INF549 A Short Introduction to OCaml Jean-Christophe Filli^atre September 11, 2018 Jean-Christophe Filli^atre A Short Introduction to OCaml INF549 1 / 102 overview lecture Jean-Christophe Filli^atre labs St´ephaneLengrand Monday 17 and Tuesday 18, 9h{12h web site for this course http://www.enseignement.polytechnique.fr/profs/ informatique/Jean-Christophe.Filliatre/INF549/ questions ) [email protected] Jean-Christophe Filli^atre A Short Introduction to OCaml INF549 2 / 102 OCaml OCaml is a general-purpose, strongly typed programming language successor of Caml Light (itself successor of Caml), part of the ML family (SML, F#, etc.) designed and implemented at Inria Rocquencourt by Xavier Leroy and others Some applications: symbolic computation and languages (IBM, Intel, Dassault Syst`emes),static analysis (Microsoft, ENS), file synchronization (Unison), peer-to-peer (MLDonkey), finance (LexiFi, Jane Street Capital), teaching Jean-Christophe Filli^atre A Short Introduction to OCaml INF549 3 / 102 first steps with OCaml Jean-Christophe Filli^atre A Short Introduction to OCaml INF549 4 / 102 the first program hello.ml print_string "hello world!\n" compiling % ocamlopt -o hello hello.ml executing % ./hello hello world! Jean-Christophe Filli^atre A Short Introduction to OCaml INF549 5 / 102 the first program hello.ml print_string "hello world!\n" compiling % ocamlopt -o hello hello.ml executing % ./hello hello world! Jean-Christophe Filli^atre A Short Introduction to OCaml INF549 5 / 102 the first program hello.ml
    [Show full text]
  • Open and Efficient Type Switch For
    Draft for OOPSLA 2012 Open and Efficient Type Switch for C++ Yuriy Solodkyy Gabriel Dos Reis Bjarne Stroustrup Texas A&M University Texas, USA fyuriys,gdr,[email protected] Abstract – allow for independent extensions, modular type-checking Selecting operations based on the run-time type of an object and dynamic linking. On the other, in order to be accepted is key to many object-oriented and functional programming for production code, the implementation of such a construct techniques. We present a technique for implementing open must equal or outperform all known workarounds. However, and efficient type-switching for hierarchical extensible data existing approaches to case analysis on hierarchical exten- types. The technique is general and copes well with C++ sible data types are either efficient or open, but not both. multiple inheritance. Truly open approaches rely on expensive class-membership To simplify experimentation and gain realistic prefor- testing combined with decision trees []. Efficient approaches mance using production-quality compilers and tool chains, rely on sealing either the class hierarchy or the set of func- we implement our type swich constructs as an ISO C++11 li- tions, which loses extensibility [9, 18, 44, 51]. Consider a brary. Our library-only implementation provides concise no- simple expression language: tation and outperforms the visitor design pattern, commonly exp ∶∶= val S exp + exp S exp − exp S exp ∗ exp S exp~exp used for type-casing scenarios in object-oriented programs. For many uses, it equals or outperforms equivalent code in In an object-oriented language without direct support for languages with built-in type-switching constructs, such as algebraic data types, the type representing an expression-tree OCaml and Haskell.
    [Show full text]