Chapter 8: Overview of Programming
Language Paradigms
Outline
Imperative Languages
Functional Programming
Logic Programming
Object-oriented
Programming
Parallel Programming
Social Issues
Applications
Software
Virtual Machine
Hardware
Algorithmic Foundations
1
Imperative Languages
From Chapter 7 we know that a HLL has following advantages when
compared to assembly language (or machine language):
1. Programmers need not to manage data movement
2. Programmers have a macroscopic view of tasks
3. Programs in HLL are portable (not machine specific)
4. Statements in a HLL are closer to standard English and usual notations
Consider LOGO:
1.
2.
3.
4.
Yes:
Yes:
Yes:
Yes:
MAKE “x SUM THING “y 4 no explicit data movement
no store and load, jump to address instruction
LOGO programs are portable
LOGO programs are far more descriptive than assembly/machine language
Thus, in fact LOGO is a “good” representative of a HLL when we restrict
ourselves to above four characteristics
2
Imperative Languages
However:
LOGO has one similarity to assembly language:
The programmer still thinks of memory locations when treating data
How?: LOGO uses the notion of a “variable” in order to indirectly “speak”
of memory (in fact LOGO is rather functional but it uses variables too)
To be more clear: A variable is nothing but a memory location with a
name associated to it (not an address as in assembly language!).
The consequence is:
Any program is treating “named” memory but in a similar way the
machine does it internally, that is, instruction by instruction
The philosophy of instructing the processor to do something is partly clear
in a LOGO program
Any programming language that is based on such instruction
philosophy is called Imperative Language (or Procedural Language)
3
Imperative Languages
Example of imperative languages:
Last 4 languages have the same philosophy, namely, treating the program
as a sequence of (high-level) instructions that manipulate data stored in
named memory (or variables)
Hence: They are very similar as we shall see
We will look at these languages by means of the following example:
LOGO has imperative constructs (but is rather functional)
Pascal
Fortran
C
Cobol
A user types in nonnegative integers
The program reads them until a sentinel (negative) value is typed in
The program then displays the sum of read integers
This program will serve as comparison of the four languages
4
Imperative Languages
But before speaking about the program, you may be asking yourself
a) what is different in these languages, and b) why do we need
different but similar ones relying on the same philosophy?
1) Differences?
differences in syntax (rules of grammar!)
Rules of control flow; e.g. how an if-then-else or while loop statement is
represented
How modules are represented
But once again all of them base on the step-by-step way of problem
solving and the notion of a variable
2) Do we need all of them?
Strictly speaking no, BUT that was an evolution…
Also, each of these languages was designed for a special application
domain
5
Imperative Languages
Examples: Pascal Teaching
Fortran Numerical applications
Cobol Databases
C
Operating systems
Pascal was designed by N. Wirth (ETH Zurich, Switzerland) in the 1970s with the
aim of teaching disciplined programming
A Pascal name can be any combination of letters and digits as long as it starts with
a letter
Some reserved words are not allowed as names
Constant values can be given names:
const Pi = 3.14
Changeable values are called variables and they can be named:
var Radius: real;
Since binary numbers may be interpreted as positive whole numbers, signed
numbers, letters, or real numbers, Pascal enforces the programmer to declare the
type of each variable
6
Imperative Languages
Suppose we declare two variables:
var
Number: integer;
Letter: char;
Pascal will not allow us to add Letter to Number (since it does not make
sense)
Our program will be more reliable than in assembly language, where such
errors cannot be intercepted.
Data types in Pascal:
integer: whole numbers
real: real numbers
char: letters
Words like var, integer, char, const and so on are reserved words
const Pi = 3.14
Pi:
.DATA 3.14
(in Pascal)
(in assembly language)
7
Imperative Languages
Input-output statements:
Recall in our Pseudo language, we wrote for example:
Get values of Radius
Written in Pascal this would be:
readln(Radius);
Correspondingly, for:
Print value of Surface
In Pascal:
writeln(Surface);
Better:
writeln(‘The surface is ‘, Surface);
Print a new (empty) line:
writeln;
8
Imperative Languages
Statements in Pascal:
variable := expression;
Meaning:
Set the value of “variable” to “(arithmetic) expression”
Steps:
Examples:
1. Evaluate expression
2. Copy the value to the memory location associated with “variable”
B := 3;
A := B + C;
C := -12;
A := A + 1;
NetSalary := Income – Tax;
Recall: one such assignment corresponds to several assembly
language instructions.
9
Imperative Languages
Boolean conditions:
An expression that evaluates to “true” or “false”
Examples:
A=0
(is A equal zero?)
B < (A+C)
(is the values of B less than the sum of the
values of A and C?)
A <> B
(is the value of A not equal the value of B?)
Comparison need not be numeric, example for use of char:
Initial := ‘D’;
Initial = ‘F’ (false)
Initial < ‘P’; (true)
Use of AND and OR is allowed:
(A = 0) or (B < (A+C))
10
Imperative Languages
If-then-else statement
General form
if(Boolean condition) then
S1
else
S2;
Example:
if(B < (A+C)) then
A := 2*A
else
A := 3*A;
Suppose:
Before: B = 2, A = 2, C = 3 After: B = 2, A = 4, C = 3
Before: B = 6, A = 2, C = 3 After: B = 6, A = 6, C = 3
11
Imperative Languages
Compound Statement
Form:
begin
S1;
S2;
…
SN;
end;
Example
begin
writeln(‘This is the first statement’);
writeln(‘This is the second statement’);
writeln(‘This is the third statement’);
end;
Attention: semicolon after the “end”
12
Imperative Languages
While loops in Pascal
General form of a While-loop
while(Boolean condition) do
S1;
Example: while (c > 0) do c := c –1;
Also functions/procedures are allowed in Pascal
Comments between curly braces { comment }
Structure of a Pascal program:
program “program name” (list of files)
constant declarations;
variable declarations;
procedure declarations;
begin
program body
end.
13
Imperative Languages
program adder(input, output) {adds positive integers and terminates with a negative one}
var number: integer; sum : integer;
begin
writeln(‘Enter a positive integer, terminate with a negative integer’);
sum := 0;
readln(number);
while(number >= 0) do
begin
sum := sum + number;
readln(number);
end;
writeln(‘The total is ‘, sum:5);
end.
14
Imperative Languages
Example of user session (after running the program “adder”):
Enter a positive integer, terminate with an negative integer’
89
116
0
43
-1234
The total is 248
NOW: let us use another language, FORTRAN, for the same program
FORTRAN = FORmula TRANslation
Introduced very early in the mid-1950s at IBM
First HLL in the world; intended for engineering purposes
15
Imperative Languages
Unlike Pascal, Fortran has the following rules:
Program instruction must be written between columns 7-72
First 6 columns used for special purposes
A ‘C’ in the first column indicates that the line is a comment
Columns 1-5 are used for statement numbers (“numeric” labels, like
assembly language!)
A positive integer value in column 6 indicates that the line is a
continuation of the precedent one
No punctuations separate statements (compare semicolon in Pascal)
because each line is a complete instruction unless denoted by the 6-th
column of the next line
Variable names have at most 6 characters, all uppercase letters or digits
but always beginning with an uppercase letter
Numerical variables do not need to be declared; defaults are I, J, K, L, M,
and N for integers and other names for real variables
16
Imperative Languages
The Fortran program:
123456
C
PROGRAM MAIN
adds positive integers and terminates with a negative one
INTEGER SUM, NUMBER
WRITE(*,*) ‘Enter a positive integer, terminate with a negative one’
SUM = 0
READ(*,*) NUMBER
10 IF (NUMBER .GE. 0)THEN
SUM = SUM + NUMBER
READ(*,*) NUMBER
GO TO 10
ENDIF
WRITE(*,20) SUM
20 FORMAT(‘ ‘, ‘The Total is ‘, I5)
END
17
Imperative Languages
About the program:
We did not need to declare SUM and NUMBER as integers
WRITE(*,*):
READ(*,*):
Major difference to Pascal
Gotos make programs unreadable!!!
WRITE(*,20):
1. * = from standard input keyboard
2. * = free formatting
.GE. = greater or equal (new Fortran compilers allow >=,<=, …)
GO TO: does the work of a while loop
1. * = to standard output screen
2. * = use standard format here print on a new line
20 is the label of the subsequent format instruction
FORMAT(…)
‘ ‘ means single-spacing between lines
Formats output, I5 means 5 positions for the SUM
18
Imperative Languages
Fortran is still in use
Because of new versions
Because there is a wealth of programmed functions in Fortran, which
are well-tested and thus highly reliable
Reuse of code (is it old?)
Cobol
Cobol = COmmon Business-Oriented Language
Introduced in 1959-1960
Designed for processing files:
Master file: e.g. inventory file containing names and quantities of items available
Transaction files: e.g. containing names and quantities sold
Master file should be updated (using information of transaction file) e.g. on
weekly basis and a summary report would be printed.
Cobol is less formal than Pascal/Fortran:
SUM = A+B reads in Cobol: ADD A TO B GIVING SUM
19
Imperative Languages
Like with FORTRAN there is now a large amount of applications
programmed in Cobol
Cobol is more adept at handling file input than keyboard input
For example, the data to be added should be prepared in a file (prior
to running the program). This also unburdens the user from entering
the same or almost the same data when running the program more
than one time
In Cobol columns 1-6 are reserved for line numbers
Column 7 may indicate that the line is a comment
A period marks the end of a sentence, which is a group of one or more
statements
20
Imperative Languages
Here the structure of the adder (details are omitted to keep things simple)
IDENTIFICATION DIVISION.
Here e.g. name of program, author
ENVIRONMENT DIVISION.
Specify a file as input and the screen as output
DATA DIVISION.
Specify how data are formatted
PROCEDURE DIVISION.
the actual program is in the procedure division
BEGIN. OPEN INPUT INPUT-DATA, OUTPUT OUTPUT-DATA.
READ-IT.
Read next number in the file and print it on the screen if >= 0 and
GO TO E-O-J if the number is negative
E-O-J.
End of job paragraph
Write the cumulative sum on the screen
STOP RUN.
21
Imperative Languages
The C programming language
Emerged in the early 1970s
HLL but with hardware-oriented constructs
Why?
Because C was designed for systems programming
The operating system Unix was written in C (now other OSs too)
Because sometimes efficiency counts more than readability
In fact, when using C you can be almost as efficient as the underlying
hardware, but in the same time you can use powerful HLL abstractions, such
modules (in C called functions).
C is now one of the most used programming languages
Compared to Pascal, Fortran, and Cobol, C is rather similar to Pascal
Liberal use of columns
Liberal use of variable names
Compact code
No Gotos are needed (because while can be used)
22
Imperative Languages
Adder program in C:
/* This a comment, the program adds positive integers
until a negative one is typed in */
#include <stdio.h> /* always include this when using input and output */
main()
{ /* ‘{‘ is like begin of Pascal; ‘}’ is like end of Pascal */
int number, sum;
sum = 0;
printf(“Enter a positive number, terminate with a negative one\n”); /* like writeln of Pascal */
scanf(“%d”, &number); /* &number means address of the variable number */
while(number >= 0) {
sum = sum + number;
scanf(“%d”, &number); /* like readln of Pascal */
}
printf(“The total is %5d“, sum);
}
23
Imperative Languages
A final word:
The family of imperative languages includes C, Pascal, Fortran, Cobol,
and others not mentioned here
The main characteristic of these languages is the use of a step-by-step
instruction sequence to solve a problem
All of them use the notion of variables (for memory locations) and
programs directly manipulate variables in order to get final results
Similarities
Fortran rather similar to Cobol (Gotos, column numbering, …)
Pascal rather similar to C (no Gotos, while loops, liberal spacing…)
No wonder:
Fortran and Cobol rather old programming languages
Pascal and C are (relatively) newer ones
24
Functional Programming
Functional programming:
A program is a combination of transformations on items. The
paradigm abstracts from variables, memory, and instructions.
A real functional programming language is LISP
LISP = LISt Processing
Designed 1958 at MIT
Second to FORTRAN in longevity:
FP (Functional Programming) is also another functional
programming language designed in 1977 (by designers of
Fortran)
Here we will use examples based on Scheme (a Lisp dialect)
Recall: LOGO is also similar to Lisp
25
Functional Programming
Functional programming paradigm:
Everything is a function (or each computing task is a function)
Function (like e.g. in C):
A mathematical recipe for taking argument(s) and doing something
on them, and delivering a result
Formally: f(arg1, arg2, arg3, …) is a function iff f transforms actual
values of arg1, arg2, arg3, … into a corresponding result (value) using
some specified rules
Different values of args may produce different results
BUT: same values of args always produce same results
Example: f(x) = 2*x
1. actual argument = 3 the result value is 6
2. actual argument = 6 the result value is 12
3. actual argument = 3 the result value is 6
Because 3. is a repetition of 1., the same result is produced
26
Functional Programming
In the broad sense:
A functions transforms a set of input data into a set of output data
In a functional programming language certain functions, called
primitives, are predefined (in libraries)
Compare: printf, scanf of C: These are predefined functions
Programmers can also defines own functions:
(define (double x)
(* 2 x))
“define”: indicates that some new function is being defined
The function name (here double) and its arguments (here x) follow
in parentheses
After defining a function, we can invoke it by providing its name
and a list of argument values (here only one for the x)
27
Functional Programming
Examples of functions invocations:
(double 4)
Result is: 2*4 = 8
(double 6)
Result is: 2*6 = 12
Another function:
(define (square x)
(* x x))
“square” multiplies its argument value by itself
Examples
(square 3) results is: 9
(square 8) results is: 64
28
Functional Programming
We can use already defined functions in order to defines new
ones
Example:
(define (polynomial x)
(double (square x)))
Mathematically: f(x) = 2.x2
Sample invocations with actual arguments
(polynomial 3)
(polynomial 4)
result: 18
result: 32
(polynomial -1)
result: 2
29
Functional Programming
Computations steps for (polynomial x): ( hidden now!!!)
1. Evaluate the value of x (including accessing memory)
2. Compute the value of (square x) and store the result in r (memory!)
3. Compute the values of (double r) and get the final result
Attention:
These steps are given in order to understand how the computer actually
performs the computation
These steps are hidden for the programmer
The programmer does not think in terms of evaluation steps and of
memory
For the programmer: “polynomial” is a black box that gives a result
when invoked using actual input values; it is a “real” function!
30
Functional Programming
Observe that “polynomial” uses two other functions:
“square”
“double”
In functional programming languages complex functions can be
built by applying the results of other functions, which may also
apply the results of still other ones, and so on
functional languages are also called applicative languages
Lisp processes lists of arguments (recall Lisp = LISt Processing)
No arguments means an empty list of arguments, called nil
Primitive list processing functions in Scheme:
list: creates a list of argument
Example
(list 2 3 4) creates the list (2 3 4)
31
Functional Programming
car: pronounced as in automobile
car takes a nonempty list as argument and returns the first
element of the list as a result
Note: the result of car is not always a list!!!
Example
(car (list 2 3 4)) returns 2
cdr: pronounced could-er
cdr takes a nonempty list as argument and returns as a result the
list that remains after the first element of the list has been
removed
Note: the result of cdr is always a list!!!
Example
(cdr (list 2 3 4)) returns (3 4)
As a special case: if the list has only one element cdr returns nil
(cdr (list 6)) returns nil
32
Functional Programming
null?:
When applied on a list it returns true if the list is nil and false
otherwise
Examples:
(null? Nil) result: true
(null? (2 4 5)) result: false
With the four primitives (list, car, crd, and null?) we can now
write our old adder program in Lisp
Rather than using a sentinel value in order to mark end of the
list of values to be added, a user only types for example:
(adder (list 3 4 5))
This would produce the result (the sum): 3+4+5 = 12
33
Functional Programming
Adder program in Lisp:
(define (adder input-list)
(cond ((null? input-list) 0)
(else (+ (car input-list) (adder (crd input-list)))))
Some remarks about the program:
Adder is a function
It has one argument named input-list
When we invoke it using (adder (list 3 4 5)) the input-list actual
value becomes (3 4 5)
cond (conditional) is like if in Pascal or C
Observe:
no loop has been used
Every thing acts a function
34
Functional Programming
Now: how does this program work?
Assume user types in: (adder (list 3 4 5))
Then following steps are performed:
1. input-list = (3 4 5)
2. (null? (3 4 5)) false
3. Else execution:
3.1 (car (3 4 5)) returns 3, which is added to a second
quantity
3.2 The second quantity is the result of invoking the adder
function on the argument (cdr (3 4 5)), which is (4 5)
3.3 Hence the result so far is: 3 + (adder (list 4 5))
4. Now the program invokes itself again in order to compute
the remaining (smaller) part (adder (list 4 5)), thus returning
to step 1 with new value for the input-list
35
Functional Programming
5. Once again a test null? is done on the list (4 5) false
6. Thus, so far results is: 3 + 4 + (adder (5))
7. Adder function calls itself another time using (5) as input-list
8. Null? false
9. Result is so far: 3 + 4 + 5 + (adder nil)
10. Last time adder is called using nil as input-list
11. Null? delivers true this time (since input-list = nil)
12. Thus, final result is 3 + 4 + 5 + 0 = 12
All of these steps are done automatically, after typing (adder
(list 3 4 5)), the user will instantly see the result: 12
36
Functional Programming
The computation steps at a glance:
(adder (3 4 5)) =
3 + (adder (4 5)) =
3 + 4 + (adder (5)) =
3 + 4 + 5 + (adder nil) =
3 + 4 + 5 + 0 = 12
The adder function definition involves itself again, but acting on a
shorter list
Recursion
Recursive function:
A function that uses itself in its definition
e.g. adder uses adder
A way to ensure termination of a recursive function f is to require that
any call of f should operate on a smaller input data set (e.g. adder
operates on a shorter list)
37
Functional Programming
What is the beauty of functional programming:
You think mathematically: everything is a function
You need not know where temporary values and results are stored
Your program can be very complex but still compact and
understandable
Your program is better suited to be verified using a specification
(correctness proofs)
No side effects are possible, which enhance reliability
Questionable is efficiency:
Always calling new functions takes time
Function implementations need a lot of memory space
However: for prototyping these questions are not primary ones
38
Insertion: Recursive Functions
Recursion is a fundamental way of problem solving in computer science
In fact, not only Lisp but almost all programming languages (including
Pascal, C, Fortran 90) support recursion
Recursion is eminently useful, because it simplifies problem solving
tremendously
Recursion is a property of an algorithm, thus, we can treat it without
referring to a special programming language, or say you can write
recursive algorithms using Pseudo-Code, if we extend it by function
definitions
Recursion is often used in real life:
Reading a book may be defined as reading the first page followed by
reading the rest of the book (the rest of … = a shorter step!)
Climbing a ladder can be defined as climbing the first rung followed by
climbing the rest of the ladder (a shorter step!)
Driving an amount of miles can be defined as driving one mile and then
driving the rest of the distance (a shorter distance!)
39
Insertion: Recursive Functions
How to use recursion at the Pseudo-Code level:
Give your algorithm a name and some arguments, the arguments
specify the initial problem to solve (that is, the whole problem)
In some steps of the algorithm apply your algorithm (by using its name)
on different arguments that specify some sub-problem
Example: computing the factorial N (the product N*(N-1)*…*2*1)
First, here a non-recursive version
Get N
Set fac to 1
Set I to 1
While I <= N
Set fac to fac*I
Increment I
Print fac
40
Insertion: Recursive Functions
Now, the recursive version of factorial:
1. Get N
2. Print fac(N)
fac(N):
1. if(N = 1) then
2.
1
else
3.
n*fac(N-1)
Remarks:
Step 1/2: solves the simplest case (N=1)
Step 3: solves the general case by combining a multiplication and a
recursive call of the algorithm using a new input argument (N-1); in
order words, the problem fac(N) is now broken down to the simpler
problem fac(N-1)
This simple example shows how recursion really simplifies a solution of a
41
whole problem by using the solution of a sub-problem
Insertion: Recursive Functions
Another example Fibonacci numbers:
F1 = F 2 = 1
Fn = Fn-1 + Fn-2 for n >= 2
A non-recursive algorithm (you need to know the formula!):
A recursive solution:
Get N
Print sqrt(5)/2*((1+sqrt(5))/2)n - sqrt(5)/2*((1-sqrt(5))/2)n
Get N
Print F(N)
F(N):
If(N = 1 or N = 2) then
1
Else
F(N-1) + F(N-2)
Often, like here, recursion consumes more resources, but recursive
42
solutions are often simpler.
Insertion: Recursive Functions
A last (but a nice) example using recursion
Towers of Hanoi:
A number of disks of decreasing diameter are put the one on the other
Like our lecture stuff
Social Issues
Applications
Software
Virtual Machine
Hardware
Algorithmic Foundations
But now each chapter is a disk
43
Insertion: Recursive Functions
The Hanoi Problem:
Given:
3 different places called: Initial, Target, and Auxiliary AND
A tower of N disks in place Initial
Goal:
Move the tower of disks from Initial to Target using the following 2
rules:
Only one disk may be moved at a time and this disk must be the top
disk on a tower
A larger disk can never be placed on top of a smaller one
Initial
Auxiliary
Target
44
Insertion: Recursive Functions
Example: Solution for 3 disks
Move
Move
Move
Move
Move
Move
Move
1
2
1
3
1
2
1
to
to
to
to
to
to
to
Target
Auxiliary
Auxiliary
Target
Initial
Target
Target
1
2
3
Initial
Auxiliary
Target
45
Insertion: Recursive Functions
But how about a general solution, that is, for an arbitrary N?
You may get mad when moving without a general scheme …
However: Recursion helps here !!!
Idea of recursive solution:
Move N-1 disks from Initial to Auxiliary
Move disk N from Initial to Target
Move N-1 disks from Auxiliary to Target
Thus, we decompose the problem into 3 steps, each step adheres to the
moving rules.
Now the algorithm is easy (we use 1=Initial, 2=Auxiliary, 3=Target):
Get N
HanoiMove(N, 1, 2, 3)
46
Insertion: Recursive Functions
HanoiMove(N, i, a, t):
if(N = 1)
Print “Move N from i to t”
else
HanoiMove(N-1, i, t, a)
Print “Move N from i to t”
HanoiMove(N-1, a, i, t)
Tracing the algorithm:
1 Disk: N = 1 HanoiMove(1, 1, 2, 3)
Prints: Move 1 from 1 to 3
2 Disks: N = 2 HanoiMove(2, 1, 2, 3)
HanoiMove(1, 1, 3, 2) Prints: Move 1 from 1 to 2
Move 2 from 1 to 3 (printed by this call)
HanoiMove(1, 2, 1, 3) Prints: Move 1 from 2 to 3
47
Logic Programming
Functional programming has the goal of letting the programmer
think about a (virtual) machine that understands functions and
operates on them. (no memory, no instructions, etc.)
Logic programming goes a step further:
The programmer should only know facts about a special domain AND
Provide rules of how new facts can be deduced
When a user poses a query (question) to the computer, the latter
begins with a fact storehouse and attempts to apply a logical
deduction to answer the user query
Domains of interests are those where the use of facts makes sense
e.g.:
Medicine
Literature
Chemistry
…
48
Logic Programming
Logic has been used successfully to write expert systems
A “human” expert in a special domain provides facts and rules,
based on his/her experience and knowledge
A logic program can make inferences that are “close” (?) to what
the human expert would make
Best representative of a logic programming language is Prolog
Prolog = PROgramming in LOGic
Facts in Prolog
Express a property about a single object or a relationship among
several ones
Example: Domain: US History
Which president was in office during what known event?
49
Logic Programming
Prolog facts:
president(lincoln, gettysburg_address).
president(lincoln, civil_war).
president(nixon, first_moon_landing).
president(jefferson, lewis_and_clack).
president(kennedy, cuban_missile_crisis).
before(jefferson, lincoln).
before(lincoln, fdr).
before(fdr, kennedy).
before(kennedy, nixon).
That was a prolog program !!!
Only a list of facts
No Gotos, whiles, memory references, …
50
Logic Programming
User interactions with the program:
User poses a query and
Program tries to answer it
Examples:
?-before(lincoln, fdr).
Yes.
{this is a user query}
{this is the Prolog answer}
Prolog asks after a response:
More? (Y/N):
If there are no matching facts, Prolog will print:
No.
?-president(lincoln, civil_war).
Yes.
?-president(truman, world_war_II).
No.
51
Logic Programming
More complicated queries can be phrased
A comma means an AND
To query facts A and B, the user writes A, B
Example:
?-president(lincoln, civil_war), before(lincoln, fdr).
Yes.
So far, only retrieval from a fact database but Prolog can do more!
Use of variables
Attention: Do not confuse Prolog variables with variables of Pascal, C, and
so on (memory aspect is hidden in Prolog)
Prolog variables are templates and they must begin with uppercase letters
Example:
?-president(lincoln, X).
This is to say give ANY known event during the office period of lincoln
Or in other words: ?-president(lincoln, Something).
52
Logic Programming
On the query ?-president(lincoln, X).
Prolog would answer:
X = gettysburg_address
X = civil_war
The query ?-before(lincoln, kennedy) would yields to No.
However, the facts:
before(lincoln, fdr).
before(fdr, kennedy).
Are part of the database ???
We have to tell Prolog, by means of a rule, that Lincoln
precedes Kennedy, even if the facts do not say that directly
A new rule has to be added
53
Logic Programming
A Prolog rule behaves like an if-then statement
Its form is:
A :- B
This means if fact B is true, then fact A is also true
Now we can add a new rule for the “precedes” relation:
precedes(X, Y) :- before(X, Y).
precedes(X, Y) :- before(X, Z), precedes(Z, Y).
Observe this was a recursive rule!
Now we can ask Prolog:
?-precedes(fdr, kennedy).
Yes.
?-precedes(lincoln, nixon).
Yes.
54
Logic Programming
?-precedes(lincoln, X).
X = fdr
X = kennedy
X = nixon
We can add another rule to say when an event is earlier than
another one.
New rule:
earlier(X, Y) :- president(PX, X), president(PY, Y), precedes(PX, PY).
That is to say: the corresponding president should be earlier
We ask Prolog:
?-earlier(world_war_II, X)
X = first_moon_landing
X = cuban_missile_crisis
55
Object-oriented Programming
OOP is another paradigm: Everything is an object
Idea: simulate the real world where everything is an object that
has some properties and can perform some tasks (functions)
OOP does not aim directly to hide the step-by-step instruction
scheme (like in functional and logic programming), the idea is
rather to put instruction sequences in the right contexts and to
leverage more programmability, reliability, and reusability
Objects:
Have attributes and
Behavior
Can communicate among each other
56
Object-oriented Programming
Attributes:
Data related to an object
Exmaple: Object “Person” would have attributes like
Name
Birthday
Hobbies
…
Behavior:
Set of functions an object can perform
Example: “Person” has function like:
isWorking()
ReadText()
WriteText()
isAtHome()
…
57
Object-oriented Programming
Communication among objects:
Using the behavioral functions
Example: Person1 wants to know whether or not person2 is at home:
if(person2.isAtHome())
doSomething1
else
doSomething2
Example: Person1 wants to give something to read to person2:
person2.ReadText(“I am back from my journey …”);
Representatives of OO languages are:
C++
Java
Smalltalk
58
Object-oriented Programming
Attributes and functions may have access restrictions
Information Hiding (Encapsulation)
Public: for everyone to use
Protected: only some objects may use them (e.g. lower in the hierarchy)
Private: only the owner object can use them (not allowed for the public)
Private attributes/functions are not accessible from the outside
Public functions can be provided as interfaces. Access to private data is
controlled by the public functions
Inheritance:
Objects may inherit attributes/functions from other ones (“relatives”)
For example:
Object “Student”
Object “Teacher”
Both may inherit attributes/functions from object “Person” (since
they are also persons)
59
Object-oriented Programming
Polymorphism
Operation can operate on different data types
Mechanisms:
Overloading of operators
Dynamic binding
+: for real, integers, …
- : for real, integers, …
…
selection at compile time
Selection of module at run-time
Source of failures:
Dynamic binding
Multiple inheritance
60
Parallel Programming
Parallel programming aims at reducing computation time
Like OOP parallel programming (PP) does not aim at hiding
step-by-step instruction processing
Rather, the Von-Neumann type style is changed in another way:
Computations are allowed to execute in parallel
Classes based on the architecture (see also Chapter 5):
SIMD
Vector computers
MIMD
Parallel computers (e.g. Intel iPSC, Transputers, …)
61
Parallel Programming
Example for SIMD:
V: private { V is private for each ALU (in ALU local memory) }
K: public { K is the global for all ALUs (in main memory) }
…
Parallel [1..5] { use 5 ALUs }
V = V + K; { done in each ALU }
End Parallel
Example adds (K, K, K, K, K) to (V, V, V, V, V)
Exampl for MIMD:
Search a name in a 20, 000, 000-entry list
use 100 processors
62
Parallel Programming
myList = List[1..200000]: private { for each processor a potion }
Name: public
…
Parallel [1..100] { use 100 processors }
SeqSearch(myList, Name, Interrupt)
If found then send interrupt
End Parallel
MIMD does not require that all processors do the same task:
Parallel
Processor 1: A = 1
Processor 2: Read(B)
Processor 3: Average(X, Y, Z)
End Parallel
63
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )