Functional Documents For Computer Systems.: Science of Computer Programming October 1995
Functional Documents For Computer Systems.: Science of Computer Programming October 1995
Functional Documents For Computer Systems.: Science of Computer Programming October 1995
net/publication/220131706
CITATIONS READS
403 2,063
2 authors:
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by David Parnas on 02 July 2015.
Jan Madey
Institute of Informatics, Warsaw University
Banacha 2, 02-097 Warsaw, Poland
Abstract
Although software documentation standards often go into great detail about the format of
documents, describing such details as paragraph numbering and section headings, they fail to
give precise descriptions of the information to be contained in the documents. This paper
does the opposite; it defines the contents of documents without specifying their format or the
notation to be used in them.
We describe documents such as the “System Requirements Document”, the “System Design
Document”, the “Software Requirements Document”, the “Software Behaviour Specifica-
tion”, the “Module Interface Specification”, and the “Module Internal Design Document” as
representations of one or more mathematical relations. By describing those relations, we
specify what information should be contained in each document.
1 Introduction
Engineers are expected to make disciplined use of science, mathematics and technology to build
useful products. Those who construct computer systems are clearly Engineers in that sense. However, the
design process used for computer systems is very different from that used in developing other
engineering products. Professional Engineers make extensive use of mathematics to provide precise
descriptions of their products. In contrast, computer systems are usually described, inaccurately and
imprecisely, using anthropomorphic analogies and intuitive language. When Engineers assemble a
system, they recognise the necessity for precise interface specifications for each of the components. In
contrast, computer system designers, particularly programmers, rarely write such specifications; instead
they rely on intuitive descriptions. The result is a “cut-and-try” process in which substantial redesign
must be done during “system integration”.
This paper advocates making computer systems design more like other types of engineering.
Applying a mix of standard engineering and mathematical concepts, we show how essential properties of
computer systems, and their components, can be described as a set of mathematical relations. By
describing these relations, computer systems designers can document their designs systematically, and
use that documentation to conduct thorough reviews. A project that involved the use of such documents
in formal reviews is described in [38, 39, 40].
This paper discusses a limited set of professional reference documents. It does not discuss many
useful types of documents such as user-manuals or queuing-theory models.
The production of design documents plays a key role in engineering practice. Professional Engineers
do not build a product without putting detailed plans on paper. Documents are prepared, and thoroughly
analysed, before construction is begun and used as references throughout further design and construction.
While one cannot prescribe procedures for designing ([42]), we can establish criteria to be used when
evaluating designs. The validation of design documents, using preestablished criteria, is a major part of
engineering. The inspiration that leads to a design may occur in a flash, but the analysis required to con-
firm the workability and safety of the approach takes much longer. That analysis is the difference be-
tween professional engineering and amateurish invention.
Design validation is a technical task that can only be carried out if the design documentation is
precise enough to permit systematic analysis. Conventional engineering documents are sufficiently
detailed that one can calculate pressures, derive differential equations, compute load factors, and find
resonant frequencies from the information that they contain.
The way that computer systems, particularly the software parts, are documented is very different.
Many of the documents produced in advance of implementation are not technical ones; they are
narratives explaining the role of the system, scenarios describing how it might be used, or glowing
descriptions of the attractive qualities it will have. Little technical evaluation can be done on the basis of
such documents. Other documents provide precise analyses of abstract algorithms but ignore much of the
actual code. Real evaluation of the overall design must wait until the implementation is nearly complete.
At that point, corrections are much more difficult (and expensive) than they would have been at an earlier
date.
In many software development organisations, documentation is not viewed as part of the design
activity but as an additional, somewhat distasteful, task that must be completed because of bureaucratic
regulations. Often the programs are written before the documentation; frequently the documentation is
written by a separate group, one that does not include the designers. Usually, programmers consider the
In this paper we describe an approach that we call “functional”, although “relational” might be more
accurate1. It is important to note that we are not using “functional” in its vernacular sense, but with its
standard mathematical meaning. In the vernacular “function” often means purpose, role, or activity, as in:
“The function of this system is to control the level of water in the tank”. In mathematics, function means a
mapping between two sets of elements (called domain and range, respectively) such that every element of
the domain is mapped to exactly one element in the range. If the latter condition is not satisfied, the
mapping is called a (binary) relation2. In certain applications, it is useful to combine a relation with an
additional set, a subset of the relation’s domain, known as the competence set, to form what we call a
limited domain relation (in short: LD-relation) [27, 43, 44]. We use the term functional to denote
approaches based on any of these concepts.
The conventions below will be used inn the sequel.
Let R be a (binary) relation, then:
(1) “R” denotes the set of ordered pairs that constitutes the relation,
(2) “domain(R)” denotes the set of values that appear as the left element of a pair in R,
(3) “range(R)” denotes the set of values that appear as the right element of a pair in R,
(4) “R(x,y)” denotes a predicate, the characteristic predicate of the set R; R(a,b) is true if and only if
(a,b) is a member of R,
(5) when R is a function, “R(x)” denotes y such that R(x,y).
It is important to note that the elements in the range and domain of a relation need not be scalars. The
universes from which these sets are drawn may include vectors of scalar values, functions, and vectors of
1 We avoid using “relational” to prevent confusion with the data base use of that term.
2 We treat a function as a special case of a relation. Alternatively, a relation can be treated as a
function mapping elements of the relation’s domain to subsets of the relation’s range.
Because computer systems are complex products, they require a great deal of documentation. In
Section 4.1 we describe the purpose of the most important documents; subsequent sections provide more
detailed descriptions. The documents we discuss are the ones mentioned in most company and industry
standards. The division into documents is intended to provide “separation of concerns”. Each document is
aimed at a different audience, i.e. Engineers with specialised interests. Our purpose is to replace the usual
vague, “common sense”, descriptions of these documents by precise definitions.
The System Requirements Document treats the complete computer system (the computers and all
associated peripheral devices) as a “black-box”. It must include a description of the environment that
identifies a set of quantities of concern to the system’s users and associates each one with a mathematical
variable. It must describe the relationships between the values of these quantities that result from physical
(or other) constraints, as well as the additional constraints on the values of the environmental quantities
that are to be enforced by the new system. Because this is a “black-box” description, any method used to
document the system requirements should be as applicable to systems built of analogue components and
relays as to systems using digital computers. The analysis of a network comprising computers and other
components is much easier if the same notation and concepts are used throughout (cf Section 4.2).
The System Design Document identifies the computers within the system and describes how they
communicate; it must also include a precise description of the relevant properties of the peripheral
devices. The values in each computer’s input and output registers are denoted by mathematical variables;
the system design document defines the relationship between these values and the values of the
environmental quantities identified in the systems requirements document (cf Section 4.3).
A critical step in documenting the requirements of a computer system is the identification of the
environmental quantities to be measured or controlled and the representation of those quantities by
mathematical variables. The environmental quantities include: physical properties (such as temperatures
and pressures), the readings on user-visible displays, administrative information, (such as the number of
people assigned to a given task), and even the wishes of a human user. These quantities must be denoted
by mathematical variables and, as is usual in engineering, that association must be carefully defined,
coordinate systems, signs etc. must be unambiguously stated. Often diagrams are essential to clarify the
correspondence between physical quantities and mathematical variables.
It is useful to characterise each environmental quantity as either monitored, controlled, or both.
Monitored quantities are those that the user wants the system to measure. Controlled quantities are those
whose values the system is intended to control3. For real-time systems, time can be treated as a monitored
quantity. In the sequel, we will use “m1”, “m2”, …, “mp” to denote the monitored quantities, and “c1”,
“c2”, …, “cq” to denote the controlled ones. If the same quantity is to be both monitored and controlled,
the corresponding values must be specified to be equal (by relation NAT, cf Section 4.2.1 below). Note
too that some systems are expected to monitor the status of their own (internal) hardware components.
Since these are often determined later in the design process, we may add to the set of monitored variables
long after design has begun.
Each of these environmental quantities has a value that can be recorded as a function of time. When
we denote a given environmental quantity by “ v ”, we will denote the time-function describing its value
by “ v t ”. Note that v t is a mathematical function whose domain consists of real numbers; its value at time t
is denoted by “ v t (t)”.
The vector of time-function ( m t1, m t2, ..., m tp ) containing one element for each of the monitored
quantities, will be denoted by “ m t ”; similarly ( c t1, c t2, ..., c tq ) will be denoted by “ c t ”.
˜ ˜
The environment, i.e. nature and previously installed systems, place constraints on the values of
environmental quantities. These restrictions must be documented in the Requirements Document and may
be described by means of a relation, which we call NAT (for nature), defined as follows:
— domain(NAT) is a set of vectors of time-functions containing exactly the instances of m t al-
˜
lowed by the environmental constraints,
— range(NAT) is a set of vectors of time-functions containing exactly the instances of c t allowed
˜
by the environmental constraints,
— ( m t, c t ) ∈ NAT if and only if the environmental constraints allow the controlled quantities to
˜ ˜
take on the values described by c t , if the values of the monitored quantities are described by m t .
˜ ˜
3 Frequently, it is not possible to monitor or control exactly the variables of interest to the user. In-
stead one must monitor or control other variables whose values are related to the variables of real
interest. Usually, one obtains the clearest and simplest documents by writing them in terms of the
variables of interest to the user in spite of the fact that the system will monitor other variables in
order to determine the value of those mentioned in the document.
The computer system is expected to impose further constraints on the environmental quantities. The
permitted behaviour may be documented by describing a relation, which we call REQ. REQ is defined as
follows:
— domain(REQ) is a set of vectors of time-functions containing those instances of m t allowed by
˜
environmental constraints,
— range(REQ) is a set of vectors of time-functions containing only those instances of c t consid-
˜
ered permissible, i.e. values that would be allowed by a correctly functioning system.
— ( m t, c t ) ∈ REQ if and only if the computer system should permit the controlled quantities to take
˜ ˜
on the values described by c t when the values of the monitored quantities are described by m t .
˜ ˜
REQ is usually not a function because one can tolerate “small” errors in the values of controlled
quantities.
Because the requirements should specify behaviour for all cases that can arise, it should be true that,
— domain(REQ) ⊇ domain(NAT),(1)
The relation REQ can be considered feasible with respect to NAT if (1) holds and
— domain(REQ ∩ NAT) = (domain(REQ) ∩ domain(NAT)).(2)
Feasibility, in the above sense, means that nature (as described by NAT) will allow the required
behaviour (as described by REQ); it does not mean that the functions involved are computable or that an
implementation is practical.
Note that (1) and (2) imply that,
— domain(REQ ∩ NAT) = domain(NAT).(3)
Discussions of the use of this model in practice can be found in [1, 10, 11, 12, 38, 39, 40]. Further
examples and discussion can be found in [47, 48].
During the system design two additional sets of variables are introduced: one represents the inputs, the
values actually stored in the input registers of the computers in the system; the other represents the
outputs, the contents of the output registers of those computers. Their values will also be described by
time-functions. Note that m t and c t are defined as in Section 4.2. Below we describe how to document the
˜ ˜
meaning of these new variables by giving the relation between their values and those previously
introduced.
Let “ i t ” denote the vector ( i t1, i t2, ..., i tr ) containing one element for each of the input registers. The
˜
physical interpretation of the inputs can be described by a relation, IN, defined as follows:
— domain(IN) is a set of vectors of time-functions containing the possible instances of m t ; it must
˜
include domain(NAT).
— range(IN) is a set of vectors of time-functions containing possible instances of i t ,
˜
— ( m , i ) ∈ IN if and only if i describes values of the input registers that are possible if m t de-
t t t
˜ ˜ ˜ ˜
scribes the values of the monitored quantities.
IN describes the behaviour of the input devices. IN is a relation rather than a function as a result of
imprecision in the measurement and transducer devices.
Let “ o t ” denote the vector ( o t1, o t2, ..., o ts ) containing one element for each of the output registers. The
˜
effects of the output devices can be described by a relation, OUT, defined as follows:
— domain(OUT) is a set of vectors of time-functions containing the possible instances of o t ,
˜
t
— range(OUT) is a set of vectors of time-functions containing possible instances of c ,
˜
— ( o , c ) ∈ OUT if and only if c describes values of the controlled quantities that are possible
t t t
˜ ˜ ˜
when o t describes the values of the output quantities when the output device(s) are function-
˜
ing correctly.
OUT describes the behaviour of the output devices. It is a relation rather than a function because of
unavoidable device imperfections.
The software requirements are determined by the System Requirements Document and System
Design Documents. As mentioned earlier, the Software Requirements Document can be seen as a
combination of those two documents. It must describe the relations NAT, REQ, IN, and OUT.
In the sequel we assume that REQ is feasible with respect to NAT.
The software will provide a system with input-output behaviour that can be described by a relation,
which we call SOF. It is defined as follows:
— domain(SOF) is a set of vectors of time-functions containing all possible instances of i t ,
˜
— range(SOF) is a set of vectors of time-functions containing possible instances of o t ,
˜
— ( i t , o t ) ∈ SOF if and only if the software could produce values described by o t when the inputs
˜ ˜ ˜
are described by i t .
˜
SOF will be a function if the software is deterministic.
Even when the software requirements document fully represents the requirements that the software
must meet, it may allow observable differences in behaviour. Frequently designers chose to implement a
subset of the behaviours6 that are allowed by the requirements document. In this way designers will make
some decisions that might otherwise have been left for the programmers. The relation SOF, describing
the behaviour of the actual implementation, can be described in a separate document known as the
Software Behaviour Specification. This document is especially important for multiple-computer systems
because it will define the allocation of tasks to the individual computers in the system. For computer
networks, or multi-processor architectures one may see a hierarchy of software behaviour specifications
with an upper level document assigning duties to a group of computers, and the lower level documents
detailing the responsibilities of individual computers or groups of. computers.
4 Inthe following the universes from which m t , c t , i t and o t are drawn can be assumed to include
˜ ˜ ˜ ˜
vectors of time-functions with the appropriate types in the ranges of those functions.
5 Given two relations R ⊆ A × B, and S ⊆ B × C, relational composition, R • S, can be defined by:
R • S = {(a,c) ∈ A × C | ∃b ∈ B [R(a,b) ∧ S(b,c)]}.
6 “Behaviours” are ( m t , c t ) pairs.
˜ ˜
Most computer systems require software that cannot be completed by a single person in a few weeks.
For such products, it is desirable to decompose the software construction task into a set of smaller
programming assignments. Each assignment is to produce a group of programs (cf. Section 4.8), which
we call a module. In this section, we assume that the modules have been designed using the information
hiding principle [23, 24]. The division of the software into modules is described informally in a Software
Module Guide, which states the responsibilities of each module [4, 41]. However, one must specify the
behaviour of these modules precisely to allow the module implementors to work independently with a
reasonable likelihood that the separately written modules will function correctly when combined.
We view each module as implementing one or more finite state machines, frequently called objects or
variables. A description of the module interface is a black-box description of these objects. Every
program in the system belongs to exactly one module. These programs use the objects created by other
modules as components of their data structure.
Writing software module interface specifications is, in principal, similar to documenting software
requirements but some simplifications are possible. Many software modules are entirely internal; there
are no environmental quantities to monitor or control and all communication can be performed through
external invocation of the module’s programs. Moreover, the state set of a software module is finite, and
state transitions can be treated as discrete events. For most such modules, real-time can be neglected
because only the sequence of events matters. This allows us to replace the concept of time-function by a
sequence describing the history in terms of discrete events; we call these sequences traces.
We identify a finite subset of the (infinite) set of possible traces as canonical traces. Every trace is
equivalent7 to exactly one canonical trace. Trace assertion specifications comprise three groups of
relations:
(1) Functions, whose domain is a set of pairs (canonical trace, event) and whose range is a set of ca-
nonical traces. The pair ((T1,e), T2) is in the function if and only if the canonical trace T2 is equivalent
to the (canonical) trace T1 extended by the event e. These functions are known as trace extension func-
tions8.
(2) Relations, whose domain contains all the canonical traces and associate each canonical trace with
a set of values of output variables.
(3) Functions, whose domain is the set of values of the output variables and whose values define the
information returned by the module to the user of the module.
Sometimes a single module will be used to implement many objects of a given class or type. For
example, a single module can be used to implement many stacks. In this case, we may choose to design
our module so that the objects are completely independent and then describe the behaviour of a typical
object of the class.
Reports [17, 18, 36, 49] describe this method in more detail and show how the set of functions can
provide a precise but readable description of the externally visible behaviour of a module. Older
discussions of this approach can be found in [2, 14, 15].
7 Two traces are equivalent if they have the same effect on future behaviour of the object. More
precise definitions can be found in [2, 17, 18, 36, 37, 49].
8 A trace extension function is sometimes called a reduction function. An alternate model, using
an extension relation, is also possible.
Each module has a private data structure and one or more programs. We propose to document the de-
sign sufficiently precisely that its correctness can be verified without reference to the code. The internal
documentation of a module should contain three types of information:
(1) A complete description of the data structure, which may include objects (variables) implemented
by other modules.
(2) A function, known as the abstraction function ([13, 21]9), whose domain is a set of pairs (object
name, data state), and whose range is the set of canonical traces for objects created by the module.
The pair ((o, d), T) is included in this function if and only if one of the traces equivalent to T describes
a sequence of events affecting the object named o that could have resulted in the data state d.
(3) An LD-relation, often referred to as the program function ([8, 21]), specifying the behaviour of
each of the module’s programs in terms of mappings from data states before the program execution to
data states after the execution (cf Section 4.8).
As has been shown by Hoare [13] and others, (e.g. [8, 21]), this information allows the design to be
verified and may subsequently be used to check on the implementation of the module interface. If we
view the module as creating a single object, (which simplifies the discussion by eliminating object
names) and consider only deterministic programs, design verification is illustrated by the diagram below.
The lower level represents changes in the module’s data structure caused by a program invocation (or
other event). The upper level represents the external view of those changes. A canonical trace, T1,
extended by a single event, e, is mapped by the trace extension function (cf Section 4.6, item (1)) to a
canonical trace, T2. The program function for the event e maps the old data state, ds1, to a new data state,
ds2. The abstraction function maps data states to canonical traces. If the design is correct, the diagram
“commutes” for all possible events.
• •
ds1 program function for event e ds2
If we view the module as producing a set of (named) objects, the diagram becomes slightly more
complex (because the domains of the functions must be modified to include the names of the objects), but
the principle remains the same. If the program is non-deterministic, the program function would be an
LD-relation, (cf Section 4.8); all of the possible next data states must be mapped to the same canonical
trace by the abstraction function.
We use the term program to denote a text describing a set of state sequences in a digital (finite state)
machine. Each of those state sequences will be called an execution of the program.
9 Mills et al [21] use the term “representation mapping” where we use “abstraction function” (p.
502).
There are two interpretations of “data flow” in computer systems. One is a description of the way that
information “flows” from one variable to another. After each execution of a program, or after each execu-
tion of the outer loop of a program that controls a periodic process, there will be constraints relating the
values of the variables in the programs. These constraints can be described by relations. There will be one
relation for each variable in the program. The range will be the set of possible values for that variable.
The domain of each relation will be the set of possible values for the other variables in the program. Such
documentation often helps when debugging a program. It describes constraints that can be checked at
run-time.
10 The texts called “procedures with parameters” are not programs (according to the definition
given in this section). Their behaviour can be described by a more general concept, the so called
“parameterised program functions” (cf [17]).
Modern communications systems are often implemented as a hierarchy of services, each service using
the one below it in the hierarchy. Each level in a hierarchical communications system can be viewed as a
module; the service offered can be specified by means of the trace assertion method. This document
corresponds to what is usually called a service specification. An implementation of a given service by the
use of lower level services and local data structures can be (partially) described using the program
functions and abstraction functions mentioned in Section 4.7. These functions correspond to what is often
called a protocol design. This is discussed in more detail in [ 3, 5, 14, 15, 28]. Most communication
protocols have a relatively small number of states. Consequently, enumerative analysis techniques, which
would not be practical in many other applications, can be used in verification of protocols. In the past
decade, work on the use of “formal methods” for protocol description and analysis has diverged from
work on verification of other types of programs. We believe that, in spite of the fact that different analysis
techniques are available, the notation used in protocol work can be the same as that used elsewhere in
computer systems. We would hope to see a merging of the work from these two communities by using the
concepts applied in this paper.
Current technology allows us to fabricate chips that perform tasks so complex that they would have
been implemented in software a few years ago. The externally visible behaviour of these chips can be
described using the techniques from Sections 4.2 and 4.6. A specification written in this way could be
called a Chip Behaviour Specification. If we make the usual discrete state assumptions, their behaviour
can be approximated using the trace assertion method. It may also prove useful to document the internal
structure of the chips by means of abstraction functions and functions that describe the change in the
internal state that result from external events.
Except for memories (which can be described simply because of their regularity), digital hardware
components usually have much smaller state spaces than software systems. Often the state spaces are
small enough that enumerative design, and design-validation techniques can be used. We believe that the
concepts discussed in this paper are applicable to hardware as well as to software, and that the small state
space makes it possible to perform some analyses that would not be practical for software systems.
While the above definitions are precise, they are not sufficient to allow practical work, because we
have not agreed upon a notation that can be used to provide definitions of the functions and relations
involved. Turning the abstract ideas into a method that can be applied in a project, requires that we define
a syntax for expressions and explain how those expressions are to be interpreted as functions or relations.
A trap, into which some “formal methods” groups have fallen is to attempt to define a universal
6 Final remarks
This section presents some thoughts on the soundness, practicality, and value of these ideas.
Many of the ideas presented in this paper are old by computer science standards. They are like the
wheel, which is often reinvented because it is a good idea. The system requirements model is essentially
that used in control theory; we have made some minor adjustments to accommodate current computer
terminology. An early version of the software requirements model was first used in 1977 (to
produce[10]); the approach seems quite obvious to those who have some background in control theory.
The trace assertion model has been in use since 1978 [2] and is very close to certain algebraic theories. Its
main advantage is that it evades several difficult issues by using functions on a domain consisting of
strings rather than function compositions. Relational semantics has been thoroughly explored by many
authors. An excellent text on relational methods is [46]. More discussion of our particular version can be
found in [ 32, 44]. The internal module documentation model is more than 20 years old and has been
reinvented by several researchers. Our effort has been to show how these well-understood theories can be
applied to the problem of documentation. Because these approaches have been thoroughly studied by
many others, we are confident that there will be few unpleasant surprises in our use of this model for
documentation.
Many theories prove impractical when applied to realistic applications. However, the original aspects
of the ideas presented in this paper grew out of practical applications and experience has shown them to
be usable. The systems and software requirements models evolved out of work at the United States Naval
Research Laboratory on the U.S. Navy’s A-7 aircraft [10, 11, 41] The ideas have since been used by a
variety of organisations including Bell Laboratories [12], AECL (Atomic Energy Canada Limited) [38,
40], and the U.S. Air Force. An early version of the trace model (2) has been used successfully by
PROSYS GmbH in Darmstadt, Germany. The internal documentation approach was used for a
We believe that there is much to be gained by using these concepts for documentation. The primary
advantage would be an increase in the quality of the documentation; mathematical documentation is far
more likely to be complete and correct than informally written documentation. This, rigidly organised,
documentation is advantageous as a reference work when one must find specific information. It is not
particularly suitable as an introduction to the software.
We see very great advantages in having a common set of notations to be used through the computer
system design process. Having a common set of concepts will allow a set of basic tools that can be used
throughout the whole process, from systems design to software design, and even into chip design. Our
approach, in which the interpretation of tables can be defined by translating the table into a conventional
expression, is extensible. New table formats can be introduced as needed because our basic model is
completely independent of the representation of the functions.
Acknowledgements
We are grateful for the comments by many people, including N.S. Erskine, D.M. Hoffman, M. Ig-
lewski, P. Kelly, A. Malton, R. Milner, J.C. Muzio, A.P. Ravn, K.A. Schneider, M. Serra, M. Sintzoff, R.
Taylor, W.M. Turski, A.J. van Schouwen, D. Weiss, Y. Wang and some of the anonymous referees.
H.D. Mills and N.G. de Bruijn, inspired the senior author to think in functional terms.
This work was supported by the Province of Ontario through Telecommunications Research Institute
of Ontario (TRIO), by the Atomic Energy Control Board (AECB), by the Natural Sciences and Engineer-
ing Research Council of Canada (NSERC), by the State Committee for Scientific Research in Poland
(KBN), and by Digital Equipment’s External Research Programme.
References
1 G.H. Archinoff, R.J. Hohendorf, A. Wassyng, B. Quigley and M.R. Borsch, “Verification of the Shut-
down System Software at the Darlington Nuclear Generating Station”, in: Proceedings of the Interna-
tional Conference on Control & Instrumentation in Nuclear Installations, The Institution of Nuclear
Engineers, Glasgow, United Kingdom, May 1990, No. 4.3, 23 pp.
2 W. Bartussek and D.L. Parnas, “Using Assertions About Traces To Write Abstract Specifications for
Software Modules”, in: Proceedings of 2nd Conference of European Cooperation in Informatics, Ven-
ice, 1978, Lecture Notes in Computer Science, 65, Springer-Verlag, pp. 211-236, 1978. Reprinted in:
Accepted for publication in Science of Computer Programming (Elesevier) 1995. 15/18
N. Gehani, A.D. Mc Gettrick (Eds.), Software Specification Techniques, AT&T Bell Telephone Labo-
ratories, 1985, pp. 111-130.
3 J. Bojanowski, M. Iglewski, J. Madey and A. Obaid: “Functional Approach to Protocols Specifica-
tion”, in: Proceedings of the 14th International IFIP Symposium on Protocol Specification, Testing &
Verification (PSTV’94), Vancouver, B.C, Canada, June 7-10, 1994, pp. 371-378.
4 K.H. Britton and D.L. Parnas, “A-7E Software Module Guide”, NRL Memorandum Report 4702,
United States Naval Research Laboratory, Washington D.C., December 1981, 35 pp.
5 F. Courtois, and D.L. Parnas, “Formally Specifying A Communications Protocol Using the Trace As-
sertion Method”, CRL Report 269, McMaster University, CRL, Telecommunications Research Insti-
tute of Ontario (TRIO), Hamilton, Ontario, Canada, July1993, 19 pgs.
6 E.W. Dijkstra, Discipline of Programming, Prentice-Hall, 1976.
7 M. Engel, M. Kubica, J. Madey, D.L. Parnas, A.P. Ravn and A.J. van Schouwen, “A Formal Ap-
proach to Computer Systems Requirements Documentation”, in: Hybrid Systems, R.L. Grossman, A.
Nerode A.P. Ravn, H. Rischel (Eds.), Lecture Notes in Computer Science 736, Springer-Verlag, 1993,
pp. 452-474.
8 J.D. Gannon, R.G. Hamlet and H.D. Mills, “Theory of Modules”, IEEE Transactions on Software
Engineering, Vol. SE-13, No. 7, July 1987, pp. 820-829.
9 E.C.R. Hehner, “Predicative Programming”, Communications of the ACM, Vol. 27, No. 2, February
1984, pp. 134-151.
10 K.L. Heninger, J. Kallander, D.L. Parnas and J.E. Shore, “Software Requirements for the A-7E Air-
craft”, NRL Memorandum Report 3876, United States Naval Research Laboratory, Washington D.C.,
November 1978, 523 pp.
11 K.L. Heninger, “Specifying Software Requirements for Complex Systems: New Techniques and their
Application”, IEEE Transactions Software Engineering, Vol. SE-6, No. 1, January 1980, pp. 2-13.
12 S.D. Hester, D.L. Parnas and D.F. Utter, “Using Documentation as a Software Design Medium”, Bell
System Technical Journal, Vol. 60, No. 8, October 1981, pp. 1941-1977.
13 C.A.R. Hoare, “Proof of Correctness of Data Representations”, Acta Informatica, Vol. 1, No. 19,
1972, February, pp. 271-281.
14 D.M. Hoffman, “Trace Specification of Communications Protocols”, Ph.D. Thesis, University of
North Carolina, Chapel Hill, 1984.
15 D.M. Hoffman, “The Trace Specification of Communications Protocols”, IEEE Transactions on
Computers, Vol. C-34, No. 12, December 1985, pp. 1102-1113.
16 M. Iglewski, M. Kubica and J. Madey, “Editor for the Trace Assertion Method”, in: Proceedings of
the 10th International Conference of CAD/CAM, Robotics and Factories of the Future: CARs &
FOF’94, M. Zaremba (Ed.), OCRI, Ottawa, Ontario, Canada, 1994, pp. 876-881.
17 M. Iglewski, J. Madey and D.L. Parnas, “Documentation Paradigms”, CRL Report 270, McMaster
University, CRL, Telecommunications Research Institute of Ontario (TRIO), Hamilton, Ontario, Can-
ada, July 1993, 45 pp.
18 M. Iglewski, J. Madey and K. Stencel, “On Fundamentals of the Trace Assertion Method”, Technical
Report TR 94-09 (198), Warsaw University, Institute of Informatics, Warsaw 1994, 8 pgs. (Also pub-
lished by the University of Quebec in Hull, Department of Computer Science, Canada, as a Technical