What's Wrong With Formal Programming Methods? Eric C.R. Hehner
|
|
|
- Cory Haynes
- 9 years ago
- Views:
Transcription
1 What's Wrong With Formal Programming Methods? Eric C.R. Hehner Department of Computer Science, University of Toronto, Toronto M5S 1A4 Canada The January 1991 issue of Computing Research News includes the headline Formal Software Design Methods Next Step In Improving Quality, with an excellent article by Dick Kieburtz [0] explaining the advantage to industry of taking this step. The trouble is: it's been the next step for ten years! In May 1982 Tony Hoare [1] made the same argument very persuasively: software engineering is not worthy of the name, certainly is not a profession, until it is based on scientific principles and is practiced with the same degree of precision as other professional engineering. Since then, formal methods have been learned and used by a few companies in Europe, though it is not yet known how successfully (people are always ready to claim success for their latest efforts). In North America, formal methods have hardly made a start. Why such a poor showing for something so highly recommended? Before answering, I should say what is meant by formal programming methods. There is a widespread misconception that formal means careful and detailed, and informal means either sloppy or sketchy. Even authors of mathematical texts, who should know better, sometimes make a statement (in English), followed by the word Formally, followed by a more careful and detailed statement (in English). By formal we mean using a mathematical formalism. A mathematical formalism is a notation (set of formulas) intended to aid in the precise and concise expression of some limited discourse. A theory is a formalism together with some rules of proof or calculation so that we can say what observations to expect. We can have a theory of almost anything, from a theory of matter, to a theory of motion, to a theory of computation, to a theory of theories. What good is a theory of programming? Who wants it? Thousands of programmers program every day without it. Why should they bother to learn it? The answer is the same as for any other theory. For example, why should anyone learn a theory of motion? You can move around perfectly well without it. You can throw a ball without it. Yet we think it important enough to teach a theory of motion in high school. What's Right One answer is that a mathematical theory gives a much greater degree of precision by providing a method of calculation. It is unlikely that we could send a rocket to Jupiter without a mathematical theory of motion. And even baseball pitchers are finding that their pitch can be improved by hiring an expert who knows some theory. Similarly a lot of mundane programming can be done without the aid of a theory of programming, but the more difficult programming is very unlikely to be done correctly without a good theory. The software industry has an overwhelming experience of buggy programs to support that statement. And even mundane programming can be improved by the use of a theory.
2 Another answer is that a theory provides a kind of understanding. Our ability to control and predict motion changes from an art to a science when we learn a mathematical theory. Similarly programming changes from an art to a science when we learn to understand programs in the same way we understand mathematical theorems. With a scientific outlook, we change our view of how the world works and what is possible. It is a valuable part of education for anyone. Formal programming methods allows us to prove that a computation does what its specification says it should do. More importantly, formal methods help us to write specifications, and to design programs so that their computations will provably satisfy a specification. This is analogous to the use of mathematics in all professional engineering: civil engineers must know and apply the theories of geometry and material stress; electrical engineers must know and apply electromagnetic theory. So why don't software engineers know and apply a theory of programming? What's Wrong The reason most often cited is lack of programmer education. Even programmers with a degree in computer science from a respectable university are unlikely to know any formal programming methods, because only a small fraction of universities teach that subject, and where it is taught it is probably an optional course taken by a small fraction of the students there. It is usually placed late in the curriculum, after students have been taught to program, and so implicitly taught that formal methods are not necessary. Education may be part of the reason, but I think there is another reason that the software industry has not yet adopted formal methods. The methods offered by academia so far have been clumsy, unwieldy, awkward methods. They slow down the process of software production without increasing the quality. It is just as easy to make mistakes in the use of the formalism and in proofs as it is to make mistakes in programming. The typical result at present is a buggy program together with a buggy proof resulting in the erroneous conclusion: program proved correct. Formal methods with proofs potentially offer a far more powerful means of finding errors in programs than testing, because a proof considers all possible computations at once, whereas testing considers only one computation at a time. To realize this potential, we must be able to do proofs accurately. Verification of a finished program against the original specification has been justifiably criticized as next to impossible. But proofs of programming steps, during program construction, have been shown to be quite do-able. Typically they are not too deep, but they involve a lot of detail, and that's where the errors occur. That's exactly the sort of task that computers should be helping us with. It is reasonable to hope that some day a prover will be as common and helpful a part of programming systems as a syntax checker and type checker are today. If history is any guide, the first ones will be usable only by their own designers, and they may confirm negative feeling about formal methods. But later, polished provers will be able to say bug on line 123, with an indication of what's wrong, as reliably as syntax checkers and type checkers do now.
3 Three formalisms Let us examine some of the formal methods academia has offered industry. The first usable theory was outlined by Hoare [2] in 1969 (based on earlier work by Floyd); it is still probably the most widely known. In it, a specification is a pair of predicates of the state, called the precondition and the postcondition. To say that a program or program fragment S satisfies the specification given by precondition P and postcondition R we write {P} S {R} meaning: if P is true at the start of execution of S, then execution will terminate and R will be true at the end. (The notation here is not the original one, but it is the one universally used now; the meaning here is total correctness, not the original partial correctness.) Let's try it on a trivial example. Informally, the specification is to increase the value of integer variable x. Formally, we face a problem: we are given no way to relate the final value of a variable to its initial value. We have to use a trick: introduce an extra variable, not part of the state space, to carry the relation. We write X {x = X} S {x > X} meaning: whatever x may have been equal to at the start, it is greater than that at the end. For S we might propose the assignment x:= x+1. To prove it correct, we must use the assignment rule {substitute e for x in R } x:= e {R} In the example, this means {x+1 > X} x:= x+1 {x > X} The precondition is not what we want, so we now use the consequence rule ( σ A P) {P} S {R} ( σ R Z) {A} S {Z} where σ (the state) stands for all variables. In the example, this means we must prove x (x = X) (x+1 > X) which is now a simple theorem of ordinary logic. All that, just to prove the obvious! Perhaps the example is unfair precisely because it is so obvious; the formalism is meant to help with problems that are not obvious. On the other hand, we fear that if trivial problems are this difficult, nontrivial ones will be impossible. We'll try a slightly bigger example later. Also, a sequence of proof steps can be collapsed into one step by the use of derived rules. There is a trade-off: fewer steps, but more rules to learn. Dijkstra [3] designed a formalism in 1976 that defines the semantics of programs explicitly by a function instead of implicitly by axioms. This formalism is probably the most studied one, certainly the one used by most textbooks on formal methods (including one by me). For program (fragment) S and postcondition R, wp(s, R) is the necessary and sufficient precondition for execution of S to end in postcondition R. As before, we use a pair of predicates of the state as specification. To say that a program or program fragment S satisfies the specification given by precondition P and postcondition R we write σ P wp(s, R) To say increase x, we still face the problem of relating final values to initial
4 values. We write x, X (x = X) wp(s, x > X) As before, we can try the assignment x:= x+1 for S. wp applied to an assignment is defined as wp(x:= e, R) = (substitute e for x in R ) so we must prove, as before, x, X (x = X) (x+1 > X) The formalism that has been used most by industry (in Europe) is Jones's VDM [4]. As in the previous two, a specification is a pair of predicates, but the second predicate is a relation between the initial and final states. The formalism automatically gives us a way to refer to the initial values of variables within the second predicate: the initial value of x is an x with a left-pointing arrow over it. My word processor lacks that typographic ability, so I shall use `x, which we can pronounce pre x. The semantics of programs is given implicitly by axioms, as in Hoare logic, and the Hoare triple notation is used. The problem of increasing x becomes {true} S {x > `x} The precondition true means that we want x increased under all initial conditions. Once again, let's take x:= x+1 for S. One of the two rules for assignment is {true} x:= e {x = `e} In our example, that gives us {true} x:= x+1 {x = `x+1} The postcondition is not what we want so we need to use the consequence rule ( σ A P) {P} S {R} ( `σ, σ R Z) {A} S {Z} This means proving `x, x (x = `x+1) (x > `x) as before. A New View People often confuse programs with computer behavior. They talk about what a program does ; of course it just sits there on the page or screen; it is the computer that does something. They ask whether a program terminates ; of course it does; it is the execution that may not terminate. A program is not computer behavior, but a description or specification of computer behavior. Furthermore, a computer may not behave as specified by a program for a variety of reasons: a disk head may crash, a compiler may have a bug, or a resource may become exhausted (stack overflow, number overflow), to mention a few. Then the difference between a program and computer behavior is obvious. As we shall see, this small confusion has been a large hindrance in the development of formal methods. We have always talked about the specification of programs, and a program satisfies a specification. We have always had two languages: the specification language (usually ordinary logic), and the programming language. But we are not specifying programs; we are specifying computation. A program is a specification. We need one language.
5 A program is a specification, but not every specification is a program. A program is an implemented specification, one that a computer can execute. To be so, it must be written in a subset of the specification language, called the programming language. A specification serves as a contract between a client who wants a computer to behave a certain way and a programmer who customizes a computer to behave as desired. For this purpose, a specification must be written as clearly, as understandably, as possible. The programmer then refines the specification to obtain a program, which a computer can execute. Sometimes the clearest, most understandable specification is already a program. When that is so, there is no need for any other specification, and no need for refinement. However, the programming notations are only part of the specification notations: those that happen to be implemented. Specifiers should use whatever notations help to make their specifications clear, including but not limited to programming notations. A New Formalism To go with the change in view, I offer a new formalism, described in [5] and in a forthcoming book [6]. In it, a specification is a single predicate in the initial and final values of the variables. The initial value of x is undecorated, and the final value is x'. To say that x is to be increased, we write simply x' > x That is surely the clearest and simplest form of specification. As we will see later, the reduction to a single predicate is no loss of information. Since a program is a specification, a program must also be a predicate in the initial and final values of the variables. For example, an assignment x:= e is a predicate that could be written in conventional logic notation as (x:= e) = (x'=e y'=y... ) saying that x'=e and all other variables are are unchanged. Semantics is explicit, as in Dijkstra's formalism, using initial and final values of variables as in Jones's formalism. Given a specification S, the programmer's problem is to find a program P such that computer behavior satisfying P also satisfies S. In logic terms, that means P S With specification x' > x and program x:= x+1 we must prove (x' = x+1) (x' > x) This is the same as in the previous formalisms, but we arrive here directly. Multiplication, Hoare-style A more reasonable comparison of these formal methods can be made with a slightly larger example. Let x and y be integer variables; when x and y are initially nonnegative, we want their product x y to be the final value of variable x. The program could be just x:= x y except that we disallow multiplication, allowing only addition, multiplication by 2,
6 division by 2, testing for even or odd, and testing for zero. This is exactly the situation of the designer of a multplier in a binary computer, and our program will be the standard binary multiplication. First let us use Hoare Logic. The most convenient way to use it is not to quote rules explicitly, but implicitly by the placement of the predicates. Predicates surrounding an assignment must be according to the assignment rule. {substitute e for x in R } x:= e {R} The sequential composition rule {P} A {Q} {Q} B {R} {P} A;B {R} simply places the intermediate predicate between the statements. {P} A; {Q} B {R} Predicates placed next to one another must be according to the consequence rule, the first implying the second. A predicate before an if-statement must be copied to the start of each branch, in one case conjoined with the condition, and in the other conjoined with its negation. The predicate after the entire if-statement must be the disjunction of the predicates at the ends of the two branches. {P} ifc then {P c} A {Q} else {P c} B {R} {Q R} The predicate before a while-loop must be of a particular form: I 0 v where I is called the invariant, and v is an integer expression called the variant. The predicate after the loop must be the invariant conjoined with the negation of the condition. Using V as an extra variable to stand for the initial value of the variant, the body of the loop must satisfy the specification shown below. {I 0 v} while c do {I 0 v=v c} B {I 0 v<v} {I c} Here it all is in action.
7 X, Y {0 x=x 0 y=y } s:= 0 {0 x=x 0 y=y s=0}; {s + x y = X Y 0 y} while y 0 do {s + x y = X Y 0<y=Y } ifeven(y) then begin {s + x y = X Y 0<y=Y even(y)} {s + x 2 y/2 = X Y 0 y/2<y } x:= x 2; {s + x y/2 = X Y 0 y/2<y } y:= y/2 {s + x y = X Y 0 y<y } end else begin {s + x y = X Y 0<y=Y even(y)} {s + x + x (y 1) = X Y 0 (y 1)/2<Y } s:= s+x; {s + x 2 (y 1)/2 = X Y 0 (y 1)/2<Y } x:= x 2; {s + x (y 1)/2 = X Y 0 (y 1)/2<Y } y:= (y 1)/2 {s + x y = X Y 0 y<y } end {s + x y = X Y 0 y<y } {s + x y = X Y y=0}; {s = X Y } x:= s {x = X Y } Multiplication, Dijkstra-style To use Dijkstra's formalism for the multiplication problem we will need to apply wp to if, while, and sequential composition, in addition to assignment. Two of them are reasonably easy: wp(ifc then A else B, R) = (c wp(a, R)) ( c wp(b, R)) wp(a; B, R) = wp(a, wp(b, R)) The treatment of loops is more difficult. We must define wp(w, R) where W is the loop while c do B. We do so as the limit of a sequence of approximations. We define W 0, W 1, W 2,... as follows: wp(w 0, R) = false wp(w n+1, R) = wp(ifc then begin B; W n end, R) From this recurrence we can calculate wp(w n, R) for any natural n. Then wp(w, R) = n wp(w n, R) Unfortunately, this is not directly usable for the development and practical proving
8 of programs. Instead, we use it to prove a theorem similar to the while rule in Hoare Logic. I 0 v (I 0 v=v c wp(b, I 0 v<v)) wp(w, I c) It says roughly: if the invariant is true before the start of the loop, and the body maintains the invariant and decreases the variant but not below zero, then the loop execution terminates and results in the invariant and the negation of the loop condition. Most users of Dijkstra's formalism do not state their proof obligations explicitly in terms of wp ; instead they present them implicitly by the placement of assertions in the program text, exactly as do the user's of the Hoare formalism. In practice, the two formalisms are used the same way. Multiplication, Jones-style Jones offers two formats for the use of VDM. One is to name every piece of a program, and to state separately the pre- and postcondition for each name. The other is to place them in the program text as in the Hoare style. But there is a difference: for Jones, a predicate cannot serve as both the postcondition for one statement and the precondition for the sequentially following statement because a precondition is a predicate of one state and a postcondition is a predicate of two states. The rule for sequential composition is {P} A {Q} ( `σ, σ Q R) {R} B {S} {P} A;B {Q;S} where Q;S is relational composition, defined as (Q;S)(`σ, σ) = σ" Q(`σ, σ") S(σ", σ) The VDM book suggests that these predicates be placed in the program in the following format: {P} {P} A {Q} ; {R} B {S} {Q;S} It seems we must pay for the convenience of having initial values given to us in the formalism by making the sequential composition rule more complicated. We pay even more for the while rule. {I 0 v} while c do {I 0 v c} B {I 0 v<`v R} {I c (R ok)} where R must be a transitive relation, and ok is the identity relation. The rule for ifis unchanged from Hoare logic. Putting it all together, we get the following.
9 s=`s} {0 x 0 y} {0 y} s:= 0 {x=`x 0 y=`y s=0} ; {0 y} while y 0 do {0<y} ifeven(y) then begin {0<y even(y)} {0<y even(y)} x:= x 2 {x=`x/2 0<y=`y even(`y) s=`s} ; {0<y even(y)} y:= y/2 {x=`x y=`y/2 0<`y even(`y) s=`s} {0 y<`y s+x y = `s+`x `y} end else begin {0<y even(y)} {0<y even(y)} s:= s+x {x=`x 0<y=`y even(`y) s=`s+`x} ; {0<y even(y)} x:= x 2 {x=`x 2 0<y=`y even(`y) s=`s} ; {0<y even(y)} y:= (y 1)/2 {x=`x y=(`y 1)/2 0<`y even(`y) {0 y<`y s+x y = `s+`x `y} end {0 y<`y s+x y = `s+`x `y} {y=0 (s+x y = `s+`x `y x=`x y=`x s=`s)} {s = `s + `x `y} ; {true} x:= s {x = `s} {x = `x `y}
10 Multiplication, new way In order to use a formalism for program construction, not just for after-the-fact verification, a programmer has to be able to progress from specification to program in small steps. In general, one may need to form a sequence of specifications S 0 S 1 S 2... S n starting with the given specification S 0 and ending with a program S n. Each specification is said to be refined by the next. Intermediate specifications, and even the original specification, may be partly in programming notation and partly in nonprogramming notation waiting to be refined. Refinement relates two specifications, not necessarily a specification and a program. We say specification S is refined by specification R, written S : R, if all computer behavior satisfying R also satisfies S. We define it formally as (S : R) = ( σ, σ' S R) where is is implied by. In this formalism, a program is a predicate, and it could be written in traditional predicate noations. The empty (do nothing) program ok is the identity relation: ok = (x'=x y'=y s'=s) We saw assignment previously. For example, (x:= x 2) = (x' = x 2 y'=y s'=s) Specifications P and Q can be composed by relational composition P;Q. And if then else is just a ternary boolean operator that can be defined by a truth table or by equating to other boolean operators. ifc then a else b = c a c b We simplify our lives enormously by leaving out the while loop in favor of recursion. Here is the multiplication example. x' = x y : s:= 0; s' = s + x y; x:= s s' = s + x y : ify=0 then ok else if even(y) then (x:= x 2; y:= y/2; s' = s + x y) else (s:= s+x; x:= x 2; y:= (y 1)/2; s' = s + x y) Each of these refinements is a theorem of ordinary logic. The first says that the specification x' = x y is implied by the relational composition of three predicates. This relational composition is now a new specification, most of which is already in programming notation. We just need to refine the middle part. There are no special inference rules for programming. We can make them look like traditional logic by making the translations we have given, then prove them in the ordinary way. Or better yet, we can prove some laws about programming notations and use them to prove these theorems more directly. For example, the Substitution Law says (x:= e; P) = (substitute e for x in P ) This is not an axiom or postulate, but an easily proven law. Using it to simplify the y 0 even(y) case, we get
11 x:= x 2; y:= y/2; s' = s + x y = x:= x 2; s' = s + x y/2 = s' = s + x 2 y/2 = s' = s + x y Similarly in the y 0 even(y) case, making all three substitutions at once, s:= s+x; x:= x 2; y:= (y 1)/2; s' = s + x y = s' = s+x + x 2 (y 1)/2 = s' = s + x y Each of these cases implies (in fact, equals) the specification being refined. All that remains is y=0 ok = y=0 x'=x y'=y s'=s s' = s + x y Clearly these proofs are completely trivial, and can be carried out automatically and silently by a prover. To a prover, the programming notations are predicates. To a compiler, the nonprogramming notations are just identifiers. To a compiler, the above refinements look like this: P : s:= 0; Q; x:= s Q : ify=0 then ok else if even(y) then (x:= x 2; y:= y/2; Q) else (s:= s+x; x:= x 2; y:= (y 1)/2; Q) The occurrence of Q in the first line can be compiled as an inline macro. The occurrences of Q at the ends of the last two lines can be compiled as branches back to the labelling Q, and that is the loop. Execution Time In one respect, we have been cheating. If the specification were really as we have said, we could have written a simpler program, say one that runs in linear time. We wanted logarithmic time, but we never said so, and never proved that we have achieved it. This criticism applies to all developments so far. The problem is easily solved: we just add a time variable t, and increase its value to represent the passage of time. We can use the formalism we already have, without change, to reason about the final value of t and thus find the execution time. The time variable is ignored by the compiler; it is there for the prover. In the multiplication example, we place an assignment t:= t+something in each of the two parts of the if that take time. If we know enough about the compiler and the hardware to know exactly how long each part takes, we can increase t by that
12 amount and find the real-time of execution. If not, let's just increase t by 1. P : s:= 0; Q; x:= s Q : ify=0 then ok else if even(y) then (x:= x 2; y:= y/2; t:= t+1; Q) else (s:= s+x; x:= x 2; y:= (y 1)/2; t:= t+1; Q) Each of these refinements is a theorem when we replace P and Q by ify<0 then t' t = else if y=0 then t' t = 0 else t' t 1 + log 2 y This says that if y starts negative, exection time is infinite; if y starts at 0, execution time is 0 ; if y starts positive, execution time is bounded by 1 + log 2 y. The proof proceeds by cases; we'll look at the case y>0 even(y). In this case, we have x:= x 2; y:= y/2; t:= t+1; t' t 1 + log 2 y = t' (t+1) 1 + log 2 (y/2) = t' t 1 + log 2 y In the previous formalisms, we proved termination by finding a variant. A variant is really a time bound, though we did not call it that; the variant we used proved that execution time was at most linear in y. We then threw away the bound, and concluded only that execution time was finite. To conclude that execution terminates (without stating a bound) is of no practical use, for it gives no clue how long one must wait for a result. If a program is claimed to have finite execution time, but in fact has infinite execution time, there is no time at which a complaint can be made that execution has taken too long. It is sometimes important to be able to say and prove that execution will not terminate. If we refine P : P, we have an infinite loop. Charging time 1 for each iteration, we can prove t' t = : t:= t+1; t' t = The right side of this refinement can be simplified according to the Substitution Law as follows: t:= t+1; t' t = = t' (t+1) = = t' t = +1 = t' t = which implies (and equals) the left side.
13 Multiplication, one more time Here is another solution to the multiplication problem, one that does not use an extra variable s to accumulate a sum. Since multplication is not allowed, x:= x y is not a program, but it is still a perfectly good specification of what is wanted (ignoring time). It can be refined as follows. x:= x y : ifx=0 then ok else if even(x) then (x:= x/2; x:= x y; x:= x 2) else (x:= (x 1)/2; x:= x y; x:= x 2; x:= x+y) The uses of x:= x y on the right are compiled as calls. The proof is very easy, and we leave it as an exercise. Data Representation The formal definition of data types has followed a well-established mathematical tradition: we define a space of values of the type, and functions (operations) on these values. Here is the well-worn stack example. We introduce the syntax stack as a new type in terms of some already known type X. We also introduce empty, push, pop, and top of the following types. empty: stack push: stack X stack pop: stack stack top: stack X And we can compare stacks for equality and inequality. The type stack can be defined by a domain axiom and an induction axiom stack = empty + stack X ( s P(s)) = P(empty) s, x (P(s) P(push(s, x))) where P: stack bool. Consequently we can say that all stacks are formed either as the empty stack or by pushing something onto a stack. Let s, t: stack and x, y: X ; then push(s, x) empty (push(s, x) = push(t, y)) = (s=t) (x=y) pop(push(s, x)) = s top(push(s, x)) = x These axioms are modelled on the Peano axioms for the natural numbers, and they provide us with a powerful formal apparatus for the investigation of stacks. We have defined push and pop as functions, but most programming is not functional; it is imperative. We program push and pop as procedures with the result that the theory is not applicable. And a programmer has no need to prove anything about all possible stacks by induction. All we want is some way to prove that data placed in the stack will be found there later when needed. Here is a simple imperative stack theory.
14 We introduce three names: push (a procedure with parameter of type X ), pop (a parameterless procedure), and top (an expression of type X ) with the axioms top'=x : push(x) ok : push(x); pop where x: X. The first axiom says that push(x) makes the top equal x. The second axiom says that a pop undoes a push. To illustrate their use, we begin with the first axiom, and sequentially compose the push with two occurrences of the empty action ok. top'=x : push(x); ok; ok Next we use the second axiom to refine each of the occurrences of ok. top'=x : push(x); push(y); pop; push(z); pop Let's throw in one more occurrence of the empty action top'=x : push(x); push(y); ok; pop; push(z); pop and refine it top'=x : push(x); push(y); push(w); pop; pop; push(z); pop We see that properly balanced pushes and pops will never disturb data from an earlier push ; it will be there when wanted, and that's all a programmer needs to prove. Conclusion What's wrong with formal programming methods? They are not yet ready for general use. I have tried to illustrate, with a few examples, that formal methods of program development can be greatly simplified without loss, and thereby greatly improved, over the methods found currently in textbooks. If I had more space, I could show that the opportunities for simplification are even greater for programming with interaction, with parallelism, with communicating processes. It is reasonable and necessary for us to go through a period of exploration; least fixed points and continuity, temporal logic, and sets of interleaved communication sequences are all good academic research, but they are not the tools that industry needs. Can programmers learn formal methods? Every programmer has learned a formalism: a programming language is a formal language. But programmers are naturally reluctant to learn a formalism that seems to be too complicated for its benefits. When industry was offered the first usable high-level programming language (Fortran), they jumped at it; when something much better came along shortly afterward (Algol), they were already committed. This time, they are not making the same mistake. With the new, simplified methods outlined in this paper and elsewhere [5, 6], I am optimistic that Kieburtz is right, that the use of formal design methods is just around the corner.
15 References [0] R.B.Kieburtz: Formal Software Design Methods Next Step In Improving Quality, Computing Research News, January 1991 p14. [1] C.A.R.Hoare: Programming is an engineering profession, PRG-27, Oxford University, May Also published in P.J.L. Wallis (ed.): Software Engineering State of the art report, Pergamon, 1983v11 n3 p Also published as Programming: Sorcery or Science, IEEE Software, April 1984 p5-16. Also published in Hoare & Jones (ed.): Essays in Computing Science, Prentice-Hall, 1989 p [2] C.A.R.Hoare: An axiomatic basis for computer programming, CACM October 1969 v12 n10 p , 583. Also published in Hoare & Jones (ed.): Essays in Computing Science, Prentice-Hall, 1989 p [3] E.W.Dijkstra: A Discipline of Programming, Prentice-Hall, [4] C.B.Jones: Systematic Software Development Using VDM, Prentice-Hall, 1986, second ed [5] E.C.R.Hehner: A Practical Theory of Programming, Science of Computer Programming, North-Holland, 1990, v14 p [6] E.C.R.Hehner: A Practical Theory of Programming, (to be published) 1991.
Rigorous Software Development CSCI-GA 3033-009
Rigorous Software Development CSCI-GA 3033-009 Instructor: Thomas Wies Spring 2013 Lecture 11 Semantics of Programming Languages Denotational Semantics Meaning of a program is defined as the mathematical
[Refer Slide Time: 05:10]
Principles of Programming Languages Prof: S. Arun Kumar Department of Computer Science and Engineering Indian Institute of Technology Delhi Lecture no 7 Lecture Title: Syntactic Classes Welcome to lecture
WHAT ARE MATHEMATICAL PROOFS AND WHY THEY ARE IMPORTANT?
WHAT ARE MATHEMATICAL PROOFS AND WHY THEY ARE IMPORTANT? introduction Many students seem to have trouble with the notion of a mathematical proof. People that come to a course like Math 216, who certainly
3. Mathematical Induction
3. MATHEMATICAL INDUCTION 83 3. Mathematical Induction 3.1. First Principle of Mathematical Induction. Let P (n) be a predicate with domain of discourse (over) the natural numbers N = {0, 1,,...}. If (1)
CHAPTER 7 GENERAL PROOF SYSTEMS
CHAPTER 7 GENERAL PROOF SYSTEMS 1 Introduction Proof systems are built to prove statements. They can be thought as an inference machine with special statements, called provable statements, or sometimes
Formal Verification of Software
Formal Verification of Software Sabine Broda Department of Computer Science/FCUP 12 de Novembro de 2014 Sabine Broda (DCC-FCUP) Formal Verification of Software 12 de Novembro de 2014 1 / 26 Formal Verification
CHAPTER 3. Methods of Proofs. 1. Logical Arguments and Formal Proofs
CHAPTER 3 Methods of Proofs 1. Logical Arguments and Formal Proofs 1.1. Basic Terminology. An axiom is a statement that is given to be true. A rule of inference is a logical rule that is used to deduce
Indiana State Core Curriculum Standards updated 2009 Algebra I
Indiana State Core Curriculum Standards updated 2009 Algebra I Strand Description Boardworks High School Algebra presentations Operations With Real Numbers Linear Equations and A1.1 Students simplify and
Introducing Formal Methods. Software Engineering and Formal Methods
Introducing Formal Methods Formal Methods for Software Specification and Analysis: An Overview 1 Software Engineering and Formal Methods Every Software engineering methodology is based on a recommended
Introduction. Appendix D Mathematical Induction D1
Appendix D Mathematical Induction D D Mathematical Induction Use mathematical induction to prove a formula. Find a sum of powers of integers. Find a formula for a finite sum. Use finite differences to
Constructing Contracts: Making Discrete Mathematics Relevant to Beginning Programmers
Constructing Contracts: Making Discrete Mathematics Relevant to Beginning Programmers TIMOTHY S. GEGG-HARRISON Winona State University Although computer scientists understand the importance of discrete
COLLEGE ALGEBRA. Paul Dawkins
COLLEGE ALGEBRA Paul Dawkins Table of Contents Preface... iii Outline... iv Preliminaries... Introduction... Integer Exponents... Rational Exponents... 9 Real Exponents...5 Radicals...6 Polynomials...5
A Static Analyzer for Large Safety-Critical Software. Considered Programs and Semantics. Automatic Program Verification by Abstract Interpretation
PLDI 03 A Static Analyzer for Large Safety-Critical Software B. Blanchet, P. Cousot, R. Cousot, J. Feret L. Mauborgne, A. Miné, D. Monniaux,. Rival CNRS École normale supérieure École polytechnique Paris
Runtime Verification of Computer Programs and its Application in Programming Education
Runtime Verification of Computer Programs its Application in Programming Education Magdalina V. Todorova, Petar R. Armyanov Abstract The paper presents a technique for runtime program verification its
Rigorous Software Engineering Hoare Logic and Design by Contracts
Rigorous Software Engineering Hoare Logic and Design by Contracts Simão Melo de Sousa RELEASE (UBI), LIACC (Porto) Computer Science Department University of Beira Interior, Portugal 2010-2011 S. Melo de
PROPERTECHNIQUEOFSOFTWARE INSPECTIONUSING GUARDED COMMANDLANGUAGE
International Journal of Computer ScienceandCommunication Vol. 2, No. 1, January-June2011, pp. 153-157 PROPERTECHNIQUEOFSOFTWARE INSPECTIONUSING GUARDED COMMANDLANGUAGE Neeraj Kumar Singhania University,
We will learn the Python programming language. Why? Because it is easy to learn and many people write programs in Python so we can share.
LING115 Lecture Note Session #4 Python (1) 1. Introduction As we have seen in previous sessions, we can use Linux shell commands to do simple text processing. We now know, for example, how to count words.
Loop Invariants and Binary Search
Loop Invariants and Binary Search Chapter 4.3.3 and 9.3.1-1 - Outline Ø Iterative Algorithms, Assertions and Proofs of Correctness Ø Binary Search: A Case Study - 2 - Outline Ø Iterative Algorithms, Assertions
Elementary Number Theory and Methods of Proof. CSE 215, Foundations of Computer Science Stony Brook University http://www.cs.stonybrook.
Elementary Number Theory and Methods of Proof CSE 215, Foundations of Computer Science Stony Brook University http://www.cs.stonybrook.edu/~cse215 1 Number theory Properties: 2 Properties of integers (whole
Overview Motivating Examples Interleaving Model Semantics of Correctness Testing, Debugging, and Verification
Introduction Overview Motivating Examples Interleaving Model Semantics of Correctness Testing, Debugging, and Verification Advanced Topics in Software Engineering 1 Concurrent Programs Characterized by
Factoring & Primality
Factoring & Primality Lecturer: Dimitris Papadopoulos In this lecture we will discuss the problem of integer factorization and primality testing, two problems that have been the focus of a great amount
Mathematics for Computer Science/Software Engineering. Notes for the course MSM1F3 Dr. R. A. Wilson
Mathematics for Computer Science/Software Engineering Notes for the course MSM1F3 Dr. R. A. Wilson October 1996 Chapter 1 Logic Lecture no. 1. We introduce the concept of a proposition, which is a statement
Specification and Analysis of Contracts Lecture 1 Introduction
Specification and Analysis of Contracts Lecture 1 Introduction Gerardo Schneider [email protected] http://folk.uio.no/gerardo/ Department of Informatics, University of Oslo SEFM School, Oct. 27 - Nov.
6.042/18.062J Mathematics for Computer Science. Expected Value I
6.42/8.62J Mathematics for Computer Science Srini Devadas and Eric Lehman May 3, 25 Lecture otes Expected Value I The expectation or expected value of a random variable is a single number that tells you
What Is School Mathematics?
What Is School Mathematics? Lisbon, Portugal January 30, 2010 H. Wu *I am grateful to Alexandra Alves-Rodrigues for her many contributions that helped shape this document. The German conductor Herbert
Testing LTL Formula Translation into Büchi Automata
Testing LTL Formula Translation into Büchi Automata Heikki Tauriainen and Keijo Heljanko Helsinki University of Technology, Laboratory for Theoretical Computer Science, P. O. Box 5400, FIN-02015 HUT, Finland
Execution of A Requirement Model in Software Development
Execution of A Requirement Model in Software Development Wuwei Shen, Mohsen Guizani and Zijiang Yang Dept of Computer Science, Western Michigan University {wwshen,mguizani,zijiang}@cs.wmich.edu Kevin Compton
Polynomials and Factoring. Unit Lesson Plan
Polynomials and Factoring Unit Lesson Plan By: David Harris University of North Carolina Chapel Hill Math 410 Dr. Thomas, M D. 2 Abstract This paper will discuss, and give, lesson plans for all the topics
Automated Theorem Proving - summary of lecture 1
Automated Theorem Proving - summary of lecture 1 1 Introduction Automated Theorem Proving (ATP) deals with the development of computer programs that show that some statement is a logical consequence of
Regular Languages and Finite Automata
Regular Languages and Finite Automata 1 Introduction Hing Leung Department of Computer Science New Mexico State University Sep 16, 2010 In 1943, McCulloch and Pitts [4] published a pioneering work on a
Formal Languages and Automata Theory - Regular Expressions and Finite Automata -
Formal Languages and Automata Theory - Regular Expressions and Finite Automata - Samarjit Chakraborty Computer Engineering and Networks Laboratory Swiss Federal Institute of Technology (ETH) Zürich March
A Framework for the Semantics of Behavioral Contracts
A Framework for the Semantics of Behavioral Contracts Ashley McNeile Metamaxim Ltd, 48 Brunswick Gardens, London W8 4AN, UK [email protected] Abstract. Contracts have proved a powerful concept
What to Expect on the Compass
What to Expect on the Compass What is the Compass? COMPASS is a set of untimed computer adaptive tests created by the American College Test (ACT) Program. Because COMPASS tests are "computer adaptive,"
Investigating a File Transfer Protocol Using CSP and B
Noname manuscript No. (will be inserted by the editor) Investigating a File Transfer Protocol Using CSP and B Neil Evans, Helen Treharne Department of Computer Science, Royal Holloway, University of London
InvGen: An Efficient Invariant Generator
InvGen: An Efficient Invariant Generator Ashutosh Gupta and Andrey Rybalchenko Max Planck Institute for Software Systems (MPI-SWS) Abstract. In this paper we present InvGen, an automatic linear arithmetic
Tips for Solving Mathematical Problems
Tips for Solving Mathematical Problems Don Byrd Revised late April 2011 The tips below are based primarily on my experience teaching precalculus to high-school students, and to a lesser extent on my other
02-201: Programming for Scientists
1. Course Information 1.1 Course description 02-201: Programming for Scientists Carl Kingsford Fall 2015 Provides a practical introduction to programming for students with little or no prior programming
Data Analysis 1. SET08104 Database Systems. Copyright @ Napier University
Data Analysis 1 SET08104 Database Systems Copyright @ Napier University Entity Relationship Modelling Overview Database Analysis Life Cycle Components of an Entity Relationship Diagram What is a relationship?
Notes on Factoring. MA 206 Kurt Bryan
The General Approach Notes on Factoring MA 26 Kurt Bryan Suppose I hand you n, a 2 digit integer and tell you that n is composite, with smallest prime factor around 5 digits. Finding a nontrivial factor
So let us begin our quest to find the holy grail of real analysis.
1 Section 5.2 The Complete Ordered Field: Purpose of Section We present an axiomatic description of the real numbers as a complete ordered field. The axioms which describe the arithmetic of the real numbers
Mathematical Induction
Mathematical Induction In logic, we often want to prove that every member of an infinite set has some feature. E.g., we would like to show: N 1 : is a number 1 : has the feature Φ ( x)(n 1 x! 1 x) How
A simple algorithm with no simple verication
A simple algorithm with no simple verication Laszlo Csirmaz Central European University Abstract The correctness of a simple sorting algorithm is resented, which algorithm is \evidently wrong" at the rst
SUBGROUPS OF CYCLIC GROUPS. 1. Introduction In a group G, we denote the (cyclic) group of powers of some g G by
SUBGROUPS OF CYCLIC GROUPS KEITH CONRAD 1. Introduction In a group G, we denote the (cyclic) group of powers of some g G by g = {g k : k Z}. If G = g, then G itself is cyclic, with g as a generator. Examples
Chapter 3. Cartesian Products and Relations. 3.1 Cartesian Products
Chapter 3 Cartesian Products and Relations The material in this chapter is the first real encounter with abstraction. Relations are very general thing they are a special type of subset. After introducing
A Propositional Dynamic Logic for CCS Programs
A Propositional Dynamic Logic for CCS Programs Mario R. F. Benevides and L. Menasché Schechter {mario,luis}@cos.ufrj.br Abstract This work presents a Propositional Dynamic Logic in which the programs are
Introduction to Formal Methods. Các Phương Pháp Hình Thức Cho Phát Triển Phần Mềm
Introduction to Formal Methods Các Phương Pháp Hình Thức Cho Phát Triển Phần Mềm Outline Introduction Formal Specification Formal Verification Model Checking Theorem Proving Introduction Good papers to
COMPUTER SCIENCE TRIPOS
CST.98.5.1 COMPUTER SCIENCE TRIPOS Part IB Wednesday 3 June 1998 1.30 to 4.30 Paper 5 Answer five questions. No more than two questions from any one section are to be answered. Submit the answers in five
The Trip Scheduling Problem
The Trip Scheduling Problem Claudia Archetti Department of Quantitative Methods, University of Brescia Contrada Santa Chiara 50, 25122 Brescia, Italy Martin Savelsbergh School of Industrial and Systems
Formal Engineering for Industrial Software Development
Shaoying Liu Formal Engineering for Industrial Software Development Using the SOFL Method With 90 Figures and 30 Tables Springer Contents Introduction 1 1.1 Software Life Cycle... 2 1.2 The Problem 4 1.3
Automated Program Behavior Analysis
Automated Program Behavior Analysis Stacy Prowell [email protected] March 2005 SQRL / SEI Motivation: Semantics Development: Most engineering designs are subjected to extensive analysis; software is
Automata and Formal Languages
Automata and Formal Languages Winter 2009-2010 Yacov Hel-Or 1 What this course is all about This course is about mathematical models of computation We ll study different machine models (finite automata,
Mathematical Induction
Mathematical Induction (Handout March 8, 01) The Principle of Mathematical Induction provides a means to prove infinitely many statements all at once The principle is logical rather than strictly mathematical,
Boolean Algebra Part 1
Boolean Algebra Part 1 Page 1 Boolean Algebra Objectives Understand Basic Boolean Algebra Relate Boolean Algebra to Logic Networks Prove Laws using Truth Tables Understand and Use First Basic Theorems
Unit 2.1. Data Analysis 1 - V2.0 1. Data Analysis 1. Dr Gordon Russell, Copyright @ Napier University
Data Analysis 1 Unit 2.1 Data Analysis 1 - V2.0 1 Entity Relationship Modelling Overview Database Analysis Life Cycle Components of an Entity Relationship Diagram What is a relationship? Entities, attributes,
Graph Theory Problems and Solutions
raph Theory Problems and Solutions Tom Davis [email protected] http://www.geometer.org/mathcircles November, 005 Problems. Prove that the sum of the degrees of the vertices of any finite graph is
Sudoku puzzles and how to solve them
Sudoku puzzles and how to solve them Andries E. Brouwer 2006-05-31 1 Sudoku Figure 1: Two puzzles the second one is difficult A Sudoku puzzle (of classical type ) consists of a 9-by-9 matrix partitioned
Integer Operations. Overview. Grade 7 Mathematics, Quarter 1, Unit 1.1. Number of Instructional Days: 15 (1 day = 45 minutes) Essential Questions
Grade 7 Mathematics, Quarter 1, Unit 1.1 Integer Operations Overview Number of Instructional Days: 15 (1 day = 45 minutes) Content to Be Learned Describe situations in which opposites combine to make zero.
If A is divided by B the result is 2/3. If B is divided by C the result is 4/7. What is the result if A is divided by C?
Problem 3 If A is divided by B the result is 2/3. If B is divided by C the result is 4/7. What is the result if A is divided by C? Suggested Questions to ask students about Problem 3 The key to this question
LAKE ELSINORE UNIFIED SCHOOL DISTRICT
LAKE ELSINORE UNIFIED SCHOOL DISTRICT Title: PLATO Algebra 1-Semester 2 Grade Level: 10-12 Department: Mathematics Credit: 5 Prerequisite: Letter grade of F and/or N/C in Algebra 1, Semester 2 Course Description:
Scalable Automated Symbolic Analysis of Administrative Role-Based Access Control Policies by SMT solving
Scalable Automated Symbolic Analysis of Administrative Role-Based Access Control Policies by SMT solving Alessandro Armando 1,2 and Silvio Ranise 2, 1 DIST, Università degli Studi di Genova, Italia 2 Security
Software Engineering. What is a system?
What is a system? Software Engineering Software Processes A purposeful collection of inter-related components working together to achieve some common objective. A system may include software, mechanical,
Lecture Notes on Linear Search
Lecture Notes on Linear Search 15-122: Principles of Imperative Computation Frank Pfenning Lecture 5 January 29, 2013 1 Introduction One of the fundamental and recurring problems in computer science is
Discrete Mathematics and Probability Theory Fall 2009 Satish Rao, David Tse Note 2
CS 70 Discrete Mathematics and Probability Theory Fall 2009 Satish Rao, David Tse Note 2 Proofs Intuitively, the concept of proof should already be familiar We all like to assert things, and few of us
(LMCS, p. 317) V.1. First Order Logic. This is the most powerful, most expressive logic that we will examine.
(LMCS, p. 317) V.1 First Order Logic This is the most powerful, most expressive logic that we will examine. Our version of first-order logic will use the following symbols: variables connectives (,,,,
Software Testing. Quality & Testing. Software Testing
Software Testing Software Testing Error: mistake made by the programmer/developer Fault: a incorrect piece of code/document (i.e., bug) Failure: result of a fault Goal of software testing: Cause failures
Regression Verification: Status Report
Regression Verification: Status Report Presentation by Dennis Felsing within the Projektgruppe Formale Methoden der Softwareentwicklung 2013-12-11 1/22 Introduction How to prevent regressions in software
Outline. 1 Denitions. 2 Principles. 4 Implementation and Evaluation. 5 Debugging. 6 References
Outline Computer Science 331 Introduction to Testing of Programs Mike Jacobson Department of Computer Science University of Calgary Lecture #3-4 1 Denitions 2 3 4 Implementation and Evaluation 5 Debugging
Describing, manipulating and pricing financial contracts: The MLFi language
Describing, manipulating and pricing financial contracts: The MLFi language Centre for Financial Research, Judge Institute of Management Cambridge, 14 March 2003 (revised January 2005) Jean-Marc Eber LexiFi,
Verification of Imperative Programs in Theorema
Verification of Imperative Programs in Theorema Laura Ildikó Kovács, Nikolaj Popov, Tudor Jebelean 1 Research Institute for Symbolic Computation, Johannes Kepler University, A-4040 Linz, Austria Institute
A simple criterion on degree sequences of graphs
Discrete Applied Mathematics 156 (2008) 3513 3517 Contents lists available at ScienceDirect Discrete Applied Mathematics journal homepage: www.elsevier.com/locate/dam Note A simple criterion on degree
Chapter 7: Functional Programming Languages
Chapter 7: Functional Programming Languages Aarne Ranta Slides for the book Implementing Programming Languages. An Introduction to Compilers and Interpreters, College Publications, 2012. Fun: a language
3 Extending the Refinement Calculus
Building BSP Programs Using the Refinement Calculus D.B. Skillicorn? Department of Computing and Information Science Queen s University, Kingston, Canada [email protected] Abstract. We extend the
Chapter 1: Key Concepts of Programming and Software Engineering
Chapter 1: Key Concepts of Programming and Software Engineering Software Engineering Coding without a solution design increases debugging time - known fact! A team of programmers for a large software development
Notes from Week 1: Algorithms for sequential prediction
CS 683 Learning, Games, and Electronic Markets Spring 2007 Notes from Week 1: Algorithms for sequential prediction Instructor: Robert Kleinberg 22-26 Jan 2007 1 Introduction In this course we will be looking
The ROI of Test Automation
The ROI of Test Automation by Michael Kelly www.michaeldkelly.com Introduction With the exception of my first project team out of college, in every project team since, I ve had to explain either what automated
Mathematical Induction. Lecture 10-11
Mathematical Induction Lecture 10-11 Menu Mathematical Induction Strong Induction Recursive Definitions Structural Induction Climbing an Infinite Ladder Suppose we have an infinite ladder: 1. We can reach
each college c i C has a capacity q i - the maximum number of students it will admit
n colleges in a set C, m applicants in a set A, where m is much larger than n. each college c i C has a capacity q i - the maximum number of students it will admit each college c i has a strict order i
Answer Key for California State Standards: Algebra I
Algebra I: Symbolic reasoning and calculations with symbols are central in algebra. Through the study of algebra, a student develops an understanding of the symbolic language of mathematics and the sciences.
8 Divisibility and prime numbers
8 Divisibility and prime numbers 8.1 Divisibility In this short section we extend the concept of a multiple from the natural numbers to the integers. We also summarize several other terms that express
Year 9 set 1 Mathematics notes, to accompany the 9H book.
Part 1: Year 9 set 1 Mathematics notes, to accompany the 9H book. equations 1. (p.1), 1.6 (p. 44), 4.6 (p.196) sequences 3. (p.115) Pupils use the Elmwood Press Essential Maths book by David Raymer (9H
Cost Model: Work, Span and Parallelism. 1 The RAM model for sequential computation:
CSE341T 08/31/2015 Lecture 3 Cost Model: Work, Span and Parallelism In this lecture, we will look at how one analyze a parallel program written using Cilk Plus. When we analyze the cost of an algorithm
A Concrete Introduction. to the Abstract Concepts. of Integers and Algebra using Algebra Tiles
A Concrete Introduction to the Abstract Concepts of Integers and Algebra using Algebra Tiles Table of Contents Introduction... 1 page Integers 1: Introduction to Integers... 3 2: Working with Algebra Tiles...
Overview. Essential Questions. Precalculus, Quarter 4, Unit 4.5 Build Arithmetic and Geometric Sequences and Series
Sequences and Series Overview Number of instruction days: 4 6 (1 day = 53 minutes) Content to Be Learned Write arithmetic and geometric sequences both recursively and with an explicit formula, use them
Problem Solving Basics and Computer Programming
Problem Solving Basics and Computer Programming A programming language independent companion to Roberge/Bauer/Smith, "Engaged Learning for Programming in C++: A Laboratory Course", Jones and Bartlett Publishers,
CORRELATED TO THE SOUTH CAROLINA COLLEGE AND CAREER-READY FOUNDATIONS IN ALGEBRA
We Can Early Learning Curriculum PreK Grades 8 12 INSIDE ALGEBRA, GRADES 8 12 CORRELATED TO THE SOUTH CAROLINA COLLEGE AND CAREER-READY FOUNDATIONS IN ALGEBRA April 2016 www.voyagersopris.com Mathematical
Lecture 3: Finding integer solutions to systems of linear equations
Lecture 3: Finding integer solutions to systems of linear equations Algorithmic Number Theory (Fall 2014) Rutgers University Swastik Kopparty Scribe: Abhishek Bhrushundi 1 Overview The goal of this lecture
FURTHER VECTORS (MEI)
Mathematics Revision Guides Further Vectors (MEI) (column notation) Page of MK HOME TUITION Mathematics Revision Guides Level: AS / A Level - MEI OCR MEI: C FURTHER VECTORS (MEI) Version : Date: -9-7 Mathematics
System modeling. Budapest University of Technology and Economics Department of Measurement and Information Systems
System modeling Business process modeling how to do it right Partially based on Process Anti-Patterns: How to Avoid the Common Traps of Business Process Modeling, J Koehler, J Vanhatalo, IBM Zürich, 2007.
Introduction to Static Analysis for Assurance
Introduction to Static Analysis for Assurance John Rushby Computer Science Laboratory SRI International Menlo Park CA USA John Rushby Static Analysis for Assurance: 1 Overview What is static analysis?
Revised Version of Chapter 23. We learned long ago how to solve linear congruences. ax c (mod m)
Chapter 23 Squares Modulo p Revised Version of Chapter 23 We learned long ago how to solve linear congruences ax c (mod m) (see Chapter 8). It s now time to take the plunge and move on to quadratic equations.
Chapter II. Controlling Cars on a Bridge
Chapter II. Controlling Cars on a Bridge 1 Introduction The intent of this chapter is to introduce a complete example of a small system development. During this development, you will be made aware of the
How To Write A Program Verification And Programming Book
Jose Bacelar Almeida Maria Joao Frade Jorge Sousa Pinto Simao Melo de Sousa Rigorous Software Development An Introduction to Program Verification & Springer Contents 1 Introduction 1 1.1 A Formal Approach
A New Interpretation of Information Rate
A New Interpretation of Information Rate reproduced with permission of AT&T By J. L. Kelly, jr. (Manuscript received March 2, 956) If the input symbols to a communication channel represent the outcomes
Validated Templates for Specification of Complex LTL Formulas
Validated Templates for Specification of Complex LTL Formulas Salamah Salamah Department of Electrical, computer, Software, and Systems Engineering Embry Riddle Aeronautical University 600 S. Clyde Morris
