<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Specification Predicates with Explicit Dependency Information</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Richard</forename><surname>Bubel</surname></persName>
							<affiliation key="aff0">
								<orgName type="department">Dept. of Computer Science and Engg</orgName>
								<orgName type="institution">Chalmers Univ. of Technology</orgName>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Reiner</forename><surname>Hähnle</surname></persName>
							<affiliation key="aff0">
								<orgName type="department">Dept. of Computer Science and Engg</orgName>
								<orgName type="institution">Chalmers Univ. of Technology</orgName>
							</affiliation>
						</author>
						<author role="corresp">
							<persName><forename type="first">Peter</forename><forename type="middle">H</forename><surname>Schmitt</surname></persName>
							<email>pschmitt@ira.uka.de</email>
							<affiliation key="aff1">
								<orgName type="department">Dept. of Computer Science</orgName>
								<orgName type="institution">Univ. of Karlsruhe</orgName>
							</affiliation>
						</author>
						<title level="a" type="main">Specification Predicates with Explicit Dependency Information</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">9E4DD8133F629F20F6DF3FD29557D879</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T19:49+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Specifications of programs use auxiliary symbols to encapsulate concepts for a variety of reasons: readability, reusability, structuring and, in particular, for writing recursive definitions. The definition of these symbols often depends implicitly on the value of other locations such as fields that are not stated explicitly as arguments. These hidden dependencies make the verification process substantially more difficult. In this paper we develop a framework that makes dependency on locations explicit. This allows to define general simplification rules that avoid unfolding of predicate definitions in many cases. A number of non-trivial case studies show the usefulness of the concept.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><p>In program logics, especially in logics that target object-oriented languages, state-dependent predicates or functions are a convenient and often necessary concept used in specifications. They allow one to keep specifications concise and easy to read for humans. They are indispensable for the specification of inherently recursive properties such as reachability. Especially in first-order program logics there is no other alternative to specify properties recursively.</p><p>Such state-dependent predicate or function symbols, which are sometimes called non-rigid symbols, are not straightforward to use in verification practice, because they require special inference techniques. To unpack and transform their definition after every single state change would be extremely inefficient and must be avoided. As a first example, we consider the frequent specification task that stipulates an object array a to contain only non-null references. It is convenient to define a non-rigid unary predicate symbol on arrays: nonNullArray(a) :⇔ ∀i.a[i] = null A typical desirable property in this context is that a simple assignment to a program variable j does not change the validity of nonNullArray. The formulation in Hoare logic <ref type="bibr" target="#b10">[11]</ref> is in the first line below, the second line is the same in Dijkstra's weakest precondition calculus <ref type="bibr" target="#b8">[9]</ref>, and the third line reformulates it in Dynamic Logic <ref type="bibr" target="#b9">[10]</ref>: {nonNullArray(a)} j := j + 1; {nonNullArray(a)} nonNullArray(a) → wp(j := j + 1, nonNullArray(a)) nonNullArray(a) → j := j + 1; nonNullArray(a) .</p><p>To prove this claim naïvely entails unpacking the definition of nonNullArray or to define a special-purpose predicate transformer having specific knowledge about the state dependencies in its definition. For example, the definition of nonNullArray contains an implicit dependency on a and on a[i] for all i, but not on any integer program variable j. The contribution of this paper is a technique that makes this kind of implicit dependency information explicit in the symbol's syntax. This leads to significantly higher automation. The presented approach has been evaluated in several small examples, e.g. verification of a selection sort algorithm, but also to verify an implementation of the Schorr-Waite algorithm. It allows to formulate uniform predicate transformers that can exploit generic dependencies and that are applicable in a variety of situations. This paper is partly based on results first published in the first co-author's dissertation <ref type="bibr" target="#b7">[8]</ref>.</p><p>The paper is structured as follows. The program logic used in this paper is introduced in Sect. 2. Syntax and semantics for the explicit dependency notation called location descriptors are presented in Sect. 3. In Sect. <ref type="bibr" target="#b3">4</ref> we show how to prove that the chosen location descriptor is consistent with the predicate's definition. Predicate transformers in the form of simplification rules that take advantage of explicit dependencies are presented in Sect. 5. Sect. 6 presents applications and case studies that show the usefulness of the concept of location descriptors. Sect. 7 credits related work and outlines future work.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Dynamic Logic with Updates</head><p>This section sketches the program logic used throughout the paper. We use object-oriented dynamic logic (ODL) <ref type="bibr" target="#b3">[4]</ref> which extends standard dynamic logic <ref type="bibr" target="#b9">[10]</ref> to cover all essential features of object-orientation, but is small enough for theoretical purposes.</p><p>The programming language used in ODL is essentially a stripped down version of JAVA. It supports all concepts except for inner and anonymous classes, floating point arithmetic, threads (and, hence, GUI). Additionally, ODL does not support dynamic method binding or exceptions. Some of these restrictions stem from open scientific problems (floating points, threads), others are a consequence of the goal to define a minimalistic object-oriented language into which all aspects of realistic languages can be compiled without much overhead. We concentrate on the language aspects essential for the paper and leave out, for example, object allocation or exceptions. For a full account see <ref type="bibr" target="#b3">[4]</ref>. When convenient we use the style of presentation given in <ref type="bibr" target="#b2">[3]</ref> for the logic JAVA CARD DL. Definition 1 (Signature). Let T all := { , boolean, int, ⊥} ∪ T d denote a finite set of types. (T all , ) forms a complete lattice with respect to the partial order (modelling the subtype hierarchy). T d is the set of all reference types (closed by intersection) containing the Null type as least element. Further, T := T all − {⊥} denotes the set of all types except the bottom type. Then the expression f (o 1 , . . . , o n ) := v denotes an elementary update. General updates are defined inductively. Let U , U 1 , U 2 be updates, then all of the following expressions are updates as well:</p><formula xml:id="formula_0">-the sequential composition U 1 ; U 2 , -the parallel composition U 1 || U 2 ,</formula><p>the conditional \if (φ); U (where φ is a formula), and the quantification \for x; U (binding the first-order variable x in update U ). Definition 4 (Terms and Formulae). The inductive definition of terms and formulae is as usual for typed first-order dynamic logic. We define only the less common cases:</p><p>-Let U be an update and ξ a term (formula), then {U } ξ is a term (formula).</p><p>-Let φ be a formula and p a program, then [p]φ (partial correctness) and p φ (total correctness) are formulae.</p><p>The following definitions formalise the semantics of formulae and updates.</p><p>Definition 5 (ODL Kripke Structure). An ODL Kripke structure K := (M, S, ρ) consists of -A partial first-order model M = (D, I 0 ) providing a domain mapping D that assigns to each type its domain (with D(int) = Z) and a partial interpretation I 0 for all rigid and non-rigid predicate symbols:</p><formula xml:id="formula_1">I 0 (q) := ↑ , if q ∈ PSym nr G , if q ∈ PSym r , for some G ⊆ D(T 1 ) × . . . × D(T n )</formula><p>where q : T 1 × . . . A function β : VSym → T ∈T D(T ) assigning to all logic variables an element of the universe of the appropriate type is a variable assignment.</p><formula xml:id="formula_2">×</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Definition 6 (Semantic Location).</head><p>A semantic location is defined as a tuple f, (e 1 , . . . , e n ) where f : T 1 × . . . × T n → T is a location function symbol as in Def. 2 and e i (for i ∈ {1, . . . , n}) are elements in D(T i ).</p><p>Definition 7 ((Consistent) Semantic Update). An elementary semantic update is a pair ( f, (e 1 , . . . , e n ) , d) where f, (e 1 , . . . , e n ) is a semantic location with f : T 1 × . . . × T n → T and d an element of D(T ). A (possible empty) set of elementary semantic updates is called semantic update. A semantic update is called consistent, if it contains for any semantic location at most one elementary semantic update. Definition 8 (Application of a Consistent Semantic Update). The application of a consistent semantic update CU is a mapping between states. Applying CU in a state S maps it to the state S = CU (S) that coincides on the value of all location function with S except for the semantic locations occurring in CU : whenever ( f, (e 1 , . . . , e n ) , d) ∈ CU then S (f )(e 1 , . . . , e n ) evaluates to d.</p><p>Updates are an explicit notation to capture symbolic state changes. The definition of a semantics for updates is rather technical due to clashes when an update assigns different values to the same location. Sequential composition describes two successive state changes, while parallel composition updates the locations simultaneously and may cause clashes by updating the same location with differing values, e.g., l := t 1 || l := t 2 . We use a last-one-wins clash resolution, i.e., in the resulting state location l has the value t 2 . Quantified updates allow us to represent state changes of infinitely many locations. Resolution of clashes caused by quantified updates is left out for space reasons (see <ref type="bibr" target="#b2">[3,</ref><ref type="bibr" target="#b17">18]</ref>).</p><p>Example 1. Some updates and their intended semantics:</p><p>-The elementary update x := t assigns to the program variable x the value t.</p><p>Applying it to a program variable y in {x := t} y results in t if x and y are the same variable, otherwise, the term evaluates to y. -The parallel update x := y || y := x swaps the content of the program variables x and y. Parallel updates are evaluated simultaneously and, therefore, are independent of each other. More formally, let K := (M, S, ρ) be an ODL Kripke structure, S ∈ S and β a variable assignment. Evaluating the above update under (K, S, β) results in the consistent update CU mapping S to a state CU (S) coinciding with S except for the program variables x and y whose values in (K, S, β) are swapped. -The quantified update \for i; a[i] := 0 assigns 0 to all components of a.</p><p>We continue by defining the semantics of terms and formulae: Definition 9 (Semantics of Terms and Formulae). The inductive semantic definitions are as usual. We list only a few non-obvious cases, full definitions are in <ref type="bibr" target="#b2">[3,</ref><ref type="bibr" target="#b3">4]</ref>.</p><p>Let K := (M, S, ρ) denote an ODL Kripke structure, t (K,S,β) the evaluation of term t in state S under a variable assignment β, and |= the validity relation.</p><p>-</p><formula xml:id="formula_3">({U} t) (K,S,β) := t (K,S ,β) where S = U (K,S,β) (S) -S, β |= p φ (p ∈ Π) iff a state S exists with S , β |= φ and ρ(p)(S, S ) -S, β |= [p]φ (p ∈ Π) iff S , β |= φ holds for any state S with ρ(p)(S, S ) -S, β |= {U} φ iff S , β |= φ, where S = U (K,S,β) (S)</formula><p>Later in the paper we need means to relate two arbitrary states on the syntactic level. For this we use a special kind of update called anonymous program update whose purpose is to perform a state transition to an unspecified state. Anonymous programs of this kind are well-known from propositional dynamic logic <ref type="bibr" target="#b9">[10]</ref>. They are deterministic and terminating.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Definition 10 (Anonymous Program, Anonymous Program Update).</head><p>The atomic programs st 1 , st 2 . . . are called (elementary) anonymous programs. The set of programs Π is extended accordingly. Further, we extend the inductive definition of updates by including the elementary anonymous program update ω i for each anonymous program st i .</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Definition 11 (Semantics of Anonymous Program Updates</head><p>). An anonymous program st i is interpreted in an ODL Kripke Structure K such that for all S ∈ S there exists exactly one state S ∈ S such that ρ(st i )(S, S ) holds. An anonymous program update ω i is then evaluated to a state transformer such that ω (K,S,β) i (S) = S for all variable assignments β.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">Symbols with Explicit Dependencies</head><p>In this section we introduce a syntactic notation for non-rigid symbols that renders explicit the implicit dependencies on the state in their definition.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.1">Location Descriptors</head><p>We need a notation to describe sets of locations. We use location descriptors introduced in the KeY-system <ref type="bibr" target="#b2">[3]</ref> for modifies/assignable clauses. The origin of this notation goes back to quantified updates <ref type="bibr" target="#b17">[18]</ref>, see also Sect. 2. Location descriptors permit a compact and extensional characterisation of location sets.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Definition 12 (Location Descriptor).</head><p>A location descriptor has the form \for x 1 , . . . , x n ; \if (Φ) loc where (i) x 1 , . . . , x n are variables bound in Φ and loc, (ii) Φ is an arbitrary formula, and (iii) loc is a term with a location function symbol as top level operator, i.e., a program variable, an attribute function or the array access function. Except for x 1 , . . . , x n no other free variables occur in Φ or loc.</p><p>Location descriptors ld 1 , ld 2 can be accumulated to sets of location descriptors by concatenation: ld new := ld 1 ; ld 2 . In case no variables are bound or Φ is identical to true, the corresponding parts in the syntax can be omitted.</p><p>Example 2. Here are some typical usages of location descriptors:</p><p>-\for List x; x.next capturing all next locations of List-typed elements.</p><p>Note that the guard has been omitted here. </p><formula xml:id="formula_4">-\for T [] a, int i; \if (i &gt;= 0 ∧ i &lt; a.length) a[i]</formula><formula xml:id="formula_5">ld (K,S) := { l, (t 1 , . . . , t n ) (K,S,β) | (K, S, β) |= Φ, β : VSym → D}</formula><p>Concatenation of location descriptors is evaluated as union of their extensions. 3 The attribute length returns the length for each array and is unspecified otherwise.</p><p>Note 2. This definition works for any kind of location descriptor. In particular, the guard formula Φ and possible subterms of the location term can be arbitrary ODL formulae and terms that may contain non-rigid symbols or even programs.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2">Syntax and Semantics of Symbols with Explicit Dependencies</head><p>The notation introduced above provides a concise way to characterise sets of locations. Now we extend the names of non-rigid (predicate and function) symbols by qualifications in the form of location descriptors. The idea is that the value of thus qualified symbols depends at most on the values of their arguments plus those locations contained in the extension of their location descriptor.</p><p>Definition 14 (Symbols with Explicit Dependencies). Let ld denote a semicolon-separated list of location descriptors and let p :</p><formula xml:id="formula_6">T 1 × • • • × T n be a non-rigid predicate. The non-rigid predicate symbol p[ld] : T 1 × • • • × T n is called</formula><p>predicate with explicit dependencies. Analogously for functions. The definitions of terms and formulae remain unchanged. The only difference is that the signature contains the above defined location-dependent symbols.</p><p>There are only few restrictions on the interpretation of ordinary non-rigid function and predicate symbols: essentially, their interpretation has to be well-defined and respect their types. The situation is different for symbols with explicit dependencies. The interpretation of a symbol p[ld] with explicit dependencies has to coincide on all states S 1 , S 2 that share the same values for the locations described by ld. This is precisely formulated in the next two definitions.</p><p>Definition 15 (ld-Equivalence). For any Kripke structure K we define for any location descriptor ld the equivalence relation ≈ ld on states where S 1 ≈ ld S 2 iff the following two conditions hold:</p><p>1. ld (K,S 1 ) = ld (K,S 2 ) (identical location descriptor extension) and 2.</p><formula xml:id="formula_7">f (K,S 1 ) (d 1 , . . . , d n ) = f (K,S 2 ) (d 1 , . . . , d n ) for any f, (d 1 , . . . , d n ) ∈ ld (K,S 1 ) .</formula><p>The additional restriction required for Kripke structures to accomodate symbols with explicit dependencies is now covered by the definition: </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Correct Definitional Extensions</head><p>Definitional extension in first-order logic preserves consistency, i.e., adding a new axiom of the form ∀x(p(x) ↔ φ) for a new predicate symbol p not occurring in φ will not introduce new inconsistencies. For predicates with explicit dependencies an axiom of the form ∀x : T p[ld] ; (p[ld](x) ↔ φ) may already by inconsistent with respect to the dependency semantics of Def. 16: one has to ensure that the implicit state dependencies of φ are reflected in the location descriptor ld. The problem only concerns the implication ∀x : T p[ld] ; (p[ld](x) → φ). We will consider only implicational axioms of this type and, to simplify the presentation, we assume there is only one axiom for each defined predicate. These axioms will be exploited during proof search as rewrite rules p[ld](t 1 , . . . , t n ) φ(t 1 , . . . , t n ) named axiom p[ld]→φ , where the t i 's are terms of the appropriate type. In this setting we allow the defined symbol to occur recursively on the right-hand side.</p><p>We intend to define a proof obligation that, when valid, ensures a given implicational axiomatisation of a location-dependent symbol to be consistent with respect to dependency semantics. The problem of termination in the case of recursive rewrite rules is a different matter and has to be dealt with separately.</p><p>We need a new concept called anonymising update for location descriptors: this is a quantified update for a given location descriptor that assigns all locations in its extension a fixed, but unknown value: Definition 17 (Anonymising Update for Location Descriptors). Let ld := \for T o; \if (φ) f (t) be a location descriptor. The quantified update</p><formula xml:id="formula_8">V ld := \for T o; \if (φ); f (t) := c(t)</formula><p>with c being a fresh uninterpreted rigid function symbol of matching type and arity is called an anonymising update for the location descriptor ld. For ld = ld 1 ; . . . ; ld n we define</p><formula xml:id="formula_9">V ld = V ld 1 || . . . || V ldn .</formula><p>With the help of anonymising updates it is possible to formulate dependence consistency (Def. 16) directly as the proof obligation</p><formula xml:id="formula_10">po p[ld]→φ := ∀x : T p[ld] ; (({ω c } {V ld } φ(x)) ↔ {V ld } φ(x)))<label>(1)</label></formula><p>where ω c is a fresh anonymous program update (Def. 10). Theorem 1. If (1) is logically valid, then ∀x : T p[ld] ; (p[ld](x) → φ) is consistent with respect to dependency semantics.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Simplification Rules</head><p>In this section we introduce two update simplification rules that can be applied to arbitrary atomic formulas with explicit dependencies. We make use of the following Lemma [3, Sect. 3.9], <ref type="bibr" target="#b17">[18]</ref>: </p><formula xml:id="formula_11">Lemma 2.</formula><formula xml:id="formula_12">:= \for T i x i ; \if (τ i ); g i (u i ) := val i .</formula><p>Crucial for the first simplification rule is the notion of relevant location symbol. Relevant location symbols are a syntactic approximation of the location symbols that a formula φ or a term t may depend on. The notation is Loc(φ) and Loc(t). In the definition below, and later, we use the following notation:</p><p>h[ld](s 1 , . . . , s n ) stands for a function or predicate symbol with explicit dependencies, ld = ld 1 ; . . . ; ld q ; ld i := \for T i1 o i1 ; . . . ;</p><formula xml:id="formula_13">T ir i o ir i ; \if (φ i ) f i (t i1 , . . . , t iα i )</formula><p>For ease of presentation we assume that f i = f j for i = j. This affects the formula ψ U 1 ,U 2 ,ld in Def. 20. It is not hard to see how to adapt this formula to the unrestricted case. Definition 18 (Relevant Location Symbols). Loc(¬ψ)  The coincidence simplification rule is of an approximate nature but is sufficient for many practical purposes. We provide a stronger, semantic simplification rule in the form of the equivalence simplification rule. We require sufficient and necessary conditions for the logical equivalence of the two formulae {U 1 } k[ld](s 1 , . . . , s n ) and {U 2 } k[ld](s 1 , . . . , s n ). First we want the argument terms of k[ld] to evaluate to the same values after the respective updates, i.e., {U 1 }s l . = {U 2 }s l for all 1 ≤ l ≤ n. Next we want to formalise that the locations described by each ld j after update U 1 are the same as those described by ld j after update U 2 and that their values coincide:</p><formula xml:id="formula_14">:= Loc(ψ) Loc(Q T x; ψ) := Loc(ψ) Q ∈ {∀, ∃} Loc(ψ • φ) := Loc(ψ) ∪ Loc(φ), • ∈ {∧, ∨, →, . . .} Loc(h(s 1 , . . . , s n )) := n i=1 Loc(s i ), h is a rigid symbol Loc( prg ψ) := FSym loc see Def. 2 Loc([prg]ψ) := FSym loc see Def. 2 Loc(g(s 1 , . . . , s n )) := {g} ∪ n i=1 Loc(s i ) g is a location fct. symbol Loc(ld) := q i=1 Loc(f i (t i1 , . . . , t iα i )) ld as stipulated above ∪ Loc(φ i ) Loc(h[ld](s 1 , . . . , s n )) := Loc(ld) ∪ n i=1 Loc(s i ) Loc(h(s 1 , . . . , s n )) := FSym loc if h is a non-rigid</formula><formula xml:id="formula_15">ψ 1 j = ∀d; ∀c j ; ∀o j ; ({U 1 } (φ j ∧ c j . = t j ∧ d . = f j (t j ))) → ∃o j ({U 2 } (φ j ∧ c j . = t j ∧ d . = f j (t j ))) ψ 2 j = ∀d; ∀c j ; ∀o j ; ({U 2 } (φ j ∧ c j . = t j ∧ d . = f j (t j ))) → ∃o j ({U 1 } (φ j ∧ c j . = t j ∧ d . = f j (t j ))) It is now not hard to see that ψ U 1 ,U 2 ,ld = q j=1 (ψ 1 j ∧ ψ 2 j ) ∧ n l=1 {U 1 }s l . = {U 2 }s l is valid if and only if {U 1 } k[ld](s 1 , . . . , s n ) ↔ {U 2 } k[ld](s 1 , . . . , s n ) is valid.</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>This justifies the following rule:</head><p>Definition 20 (Equivalence Simplification Rule).</p><formula xml:id="formula_16">{U 1 } k[ld](s 1 , . . . , s n ) {U 2 } k[ld](s 1 , . . . , s n ) provided formula ψ U 1 ,U 2 ,ld holds.</formula><p>Example 6. We modify Ex. 5 by using the more specialised 0-ary predicate nonNullArray a [\for int i; a[i]] restricting the non-null element property to only those arrays referenced by the program variable a. Let</p><formula xml:id="formula_17">a = b → (nonNullArray a [. . .] → {b[0] := null} nonNullArray a [. . .])</formula><p>the formula to be proven valid where b is an array of the same type as a. Note that we cannot apply the coincidence simplification rule here: Loc(\for int i; a[i]) yields [•], i.e., the non-rigid array lookup function which is also the leading function symbol of the update {b[0] := null} . Now we apply the equivalence simplification rule which gives for formula ψ 1 1 :</p><formula xml:id="formula_18">∀d : T ; c 1 : T []; c 2 : int; i : int; (({b[0] := null} (true ∧ c 1 . = a ∧ c 2 . = i ∧ d . = a[i])) → ∃i : int; (true ∧ c 1 . = a ∧ c 2 . = i ∧ d . = a[i]))</formula><p>Under the assumption a = b this can be easily proven with a first-order theorem prover after applying the update.</p><p>Note 4. The calculus with the equivalence simplification rule added is complete for the logic containing symbols with explicit dependencies relative to the calculus without those symbols.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6">Applications and Case Studies</head><p>In this section we show applications of symbols with explicit dependency information modelling specification predicates such as reachability. Using these symbols provides advantages for interactive and automated proving. By being able to delay expanding the definition of a non-recursive predicate, the proof remains readable for a human reader. The automation benefits from the availability of general simplification rules reducing the need to look into the definition of non-rigid symbols. This is briefly illustrated in two case studies.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.1">Specification predicates</head><p>Reachability. Treatment of linked data structures in specification and verification of object-oriented programs requires routinely to express reachability between two objects via a finite chain of fields. Fig. <ref type="figure">1</ref> shows a simple binary, directed tree, where subtrees are accessible via the fields left and right. Specifying properties such as an element occurring in a given list requires to introduce and formalise the concept of reachability for these data structures. In the following we concentrate on the definition of a predicate formalising reachability for the directed, binary tree structure in Fig. <ref type="figure">1</ref>. We aim to define a Fig. <ref type="figure">1</ref>. A binary tree datastructure with its associated reachable predicate symbol.</p><p>predicate that takes three arguments x, y (both of type Tree) and n (of type int) and holds if the subtree y can be reached from tree x in exactly n steps using only the fields left and right. The recursive definition for reachability predicate is rather straightforward:</p><formula xml:id="formula_19">reach(x, y, n) :⇔        false , if n &lt; 0 x . = y , if n . = 0 (x.left . = null ∧reach(x.left, y, n − 1))∨ (x.right . = null ∧reach(x.right, y, n − 1)) , if n &gt; 0</formula><p>A calculus rule can be easily derived from the definition. The predicate is clearly non-rigid as it depends not only on the value of its arguments but also on the left and right fields of the subtrees below and including x. Therefore, we easily identify a location descriptor capturing all location dependencies, namely \for Tree t; t.left; \for Tree t; t.right describing the set of all left, right locations of all trees. Hence, the location-dependent predicate symbol for capturing reachability in our notation is: reach[\for Tree t; t.left; \for Tree t; t.right](Tree, Tree, int) .</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.2">Selection Sort</head><p>Verification of a sorting algorithm consists of showing that the result is indeed sorted and that the result contains exactly the elements of the original collection, in other words, that the result is a permutation of the input. For the verification of a standard selection sort implementation in JAVA a specification predicate with explicit dependencies has been used to formalise permutation of two arrays. <ref type="foot" target="#foot_0">4</ref>The permutation predicate perm</p><formula xml:id="formula_20">[\for int[] o; int i; o[i]](int[], int[])</formula><p>is defined with the help of a recursive count of the occurrences of all elements in both arrays. The predicate occurs once in the post condition stating that the resulting array is indeed a permutation of the original, and the second time in the loop invariant of the sorting algorithm.</p><p>The selection sort algorithm starts at the first array element and swaps it with the first minimal element encountered in the subsequent array continuing until the last element is reached. Therefore, it utilises two nested loops. To prove that both loops preserve the permutation property without predicates having explicit location dependencies requires several inductive subproofs. To substantiate this claim we look at the following formula<ref type="foot" target="#foot_1">5</ref> that occurs subgoal during the proof and has to be proven valid: The update of the formula in the implication's premise states a transition to a state where array aCopy is a shallow copy of the old content of array a0.</p><p>Simultaneously new values are assigned to the components of array a0. The complete formula in the premise states then that in this state aCopy and a0 are permutations.</p><p>The update of the formula in the conclusion starts with a number of updates stemming from branch predicates irrelevant for the permutation property. The quantified updates assign the components of the arrays aCopy and a0 the exact same values as it is the case for the premise formula. But the following two updates lead to a slightly different state with a0[idx1] and a0[idx2] swapped.</p><p>Obviously, the implication is valid, because a standard transposition lemma can be used to show preservation of the permutation property. The technical difficulty is that a straightforward application of this transposition lemma is not possible. One has to prove that all updates preceding the array locations including the twelve updates abbreviated by ". . . " have no effect on the permutation property. This is done inductively using a strengthening of the claim where for any possible value of b10, b4, b5, . . . the permutation property remains unchanged.</p><p>In contrast, the approach presented in this paper exploiting dependency information allows to prove the formula valid without induction. Application of the Coincidence Simplification Rule (Def. 19) simplifies the state representation in the conclusion so far that the application of the transposition lemma is directly possible. We were able to prove the permutation property for an executable JAVA implementation of selection sort with only one user interaction exploiting the fact that swapping exactly two elements in an array preserves the permutation property.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.3">Schorr-Waite Algorithm</head><p>The most complex case study so far where predicates with explicit dependencies were used is the verification of a fully functional JAVA implementation of the Schorr-Waite graph marking algorithm <ref type="bibr" target="#b19">[20]</ref> for arbitrary finite graph structures. The abstract algorithm has been verified in several case studies <ref type="bibr" target="#b6">[7,</ref><ref type="bibr" target="#b5">6,</ref><ref type="bibr" target="#b20">21,</ref><ref type="bibr" target="#b15">16,</ref><ref type="bibr" target="#b0">1,</ref><ref type="bibr" target="#b4">5,</ref><ref type="bibr" target="#b11">12]</ref>, mostly for the case of binary graphs. Our case study, first reported in <ref type="bibr" target="#b7">[8]</ref>, is to knowledge the first time that an executable JAVA implementation for the general case was verified.</p><p>The Schorr-Waite graph marking algorithm saves memory by avoiding to encode the taken path in the method call stack. Instead a small number of auxiliary variables and subtle pointer rotations are used to encode the backtracking path. Besides showing that all reachable nodes are visited, the challenge is to show that afterwards the graph structure is restored, because the traversal uses destructive pointer manipulations.</p><p>Specification predicates with explicit dependencies were employed to express reachability of two nodes in the graph structure and for a specification predicate that characterises the backtracking path. The reachability predicate has been specified similar to the one in Sect. 6.1. The predicate characterising the backtracking path is specified in such a way that it evaluates to true if a given node is an element of the currently taken path. This is clearly state-dependent as the backtracking path changes during execution.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7">Related and Future Work</head><p>The Java Modelling Language (JML) <ref type="bibr" target="#b13">[14]</ref> supports a depends clause used to express on which other fields a model field depends. The depends clause is then used to extend assignable clauses appropriately in case they contain model fields. These depends clauses have been introduced by Leino <ref type="bibr" target="#b14">[15]</ref>, the main idea being to replace the occurrence of an abstract/model field a with a function symbol a (f 1 , . . . , f n ) that explicitly enumerates the fields it depends on.</p><p>Separation logic <ref type="bibr" target="#b16">[17]</ref> requires to specify exactly those locations of the heap (alternatively, to separate a heap into two orthogonal heaps) that are necessary to prove a property. The local judgements are then generalised by application of a frame rule. This approach is in the following sense complementary to ours: in separation logic, the shape of the heap is made explicit and dependencies are lifted with the help of a frame axiom. We make location dependencies explicit and can, therefore, abstract away from the concrete layout of the heap. This seems more appropriate for target languages such as JAVA. Another advantage of our approach is that only standard typed first-order logic is used.</p><p>Dynamic frames as introduced in <ref type="bibr" target="#b12">[13]</ref> provide a uniform treatment of modified locations and dependencies, which are separate concerns in the presented work allowing for more precision. Of particular interest is the preservance operator Ξf for a dynamic frame (set of locations) f expressing that a computation does depend on or modify it. This property can be translated to our framework and logic. The other operators for dynamic frames deal with variants of modifies clauses in presence of object creation.</p><p>In <ref type="bibr" target="#b1">[2]</ref> read effects are used for treating invocations of pure methods. Our approach is directly targeted at the level of specification predicates without the need to them as pure boolean methods, it provides a compact and precise notion for the dependencies and works without an explicit heap presentation. Another concern of <ref type="bibr" target="#b1">[2]</ref> is well-definedness of specifications containing pure methods. For our approach well-definedness is desirable, but will not cause unsoundness of the verification system.</p><p>Further related work focusses on data groups or similar concepts to support information hiding and encapsulation. This is ongoing work in the context of the KeY project.</p><p>Future work includes to exploit further application scenarios for predicates with explicit dependencies. Rümmer suggested to use them to achieve secondorder like specification capabilities in a first-order dynamic logic through parameterisation with functions. This allows, for example, to use the same specification for the sum over all elements of an array i f (a[i]) for any function f . Further, we will investigate how to improve automation of the equivalence update simplification rule, i.e., in finding a suitable equivalent update U 2 .</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="8">Conclusion</head><p>We introduced non-rigid specification predicate (and function) symbols that explicitly list the set of locations their value may depend on. Then we presented a verification framework for such symbols with explicit dependencies. This framework consists of two parts: on the one hand a uniformly generated proof obligation that ensures correctness of a predicate with explicit dependencies with respect to its axiomatisation; on the other hand a number of general simplification rules that allow one to exploit explicit dependencies within the context of a proof. Several application scenarios common in program verification as well as two case studies support the usefulness of our approach. The implementation and case studies were done within the KeY-system <ref type="bibr" target="#b2">[3]</ref>, however, as pointed out in the introduction the problem of location-dependent predicates as well as the solution presented here can be transferred to other program logics based on weakest precondition reasoning.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Σ</head><label></label><figDesc>T := {Q, Op, Mod, U, Π, PSym, FSym, VSym} is a typed signature over T , where Q, Op are sets containing the classical first-order quantifiers and operators. Mod contains the box [•] and diamond • modalities. U is the set of elementary updates (defined below) and Π the set of programs. PSym, FSym are typed predicate and function symbols with arity function α assigning each symbol its signature. VSym is a set of typed first-order logic variables.As mentioned in Sect. 1 we distinguish between rigid and state-dependent (non-rigid) function and predicate symbols with the following notation: PSym = PSym r ∪ PSym nr and FSym = FSym r ∪ FSym nr . It is useful to single out from the non-rigid function symbols FSym nr the subset of location function symbols, i.e., functions used to represent local program variables, fields and arrays that can be changed by a program or update: Definition 2 (Location Function Symbols). The set of location function symbols FSym loc ⊆ FSym nr contains for each arity an infinite number of symbols including for each program variable pv used in an ODL program a constant symbol with the same name and type; for each attribute a of type T declared in a class C of the ODL program, a unary location function symbol a@(C) : C → T ; the array access operator [] : × int → . Note 1. ODL features separate syntactic categories for program and logic (firstorder) variables. Program variables are modelled as non-rigid constants and cannot be quantified. Logic variables are rigid, quantifiable, and must not occur inside programs. We omit the @(C) suffix from attribute names if no ambiguity arises and write o.a instead of a(o) for attribute lookup expressions. Definition 3 (Updates). Given a location function f and terms o i and v.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Definition 16 (Note 3 .Example 3 .</head><label>1633</label><figDesc>Dependency-Consistent Kripke Structure). We call an ODL Kripke structure K := (M, S, ρ) dependency-consistent if for any predicate k[ld] (function f [ld]) depending on ld and any two states S 1 , S 2 with S 1 ≈ ld S 2 the evaluation of predicate k[ld] (function f [ld]) in S 1 and S 2 coincides. Lemma 1. Let K be a dependency-consistent Kripke structure. Then in any two states S 1 , S 2 ∈ S with t(K,S 1 ) i = t (K,S 2 ) i (i ∈ {1 . . . n}) the atomic formula p[ld](t 1 , .. . , t n ) evaluates to the same truth value whenever S 1 ≈ ld S 2 holds. Analogously for location dependent function symbols. The notions of satisfiability, validity and model carry over to dependency-consistent Kripke structures in a straightforward manner. From now on we deal only with dependency-consistent Kripke structures and the corresponding notions of model, validity, etc., if not stated otherwise. Instead of modelling nonNullArray as a non-rigid predicate as done on p. 28, it can now be modelled as a predicate symbol with explicit dependencies: nonNullArray[\for T [] a, int i; a[i]] : T []. This expresses explicitly that its value depends only on the value of the components of T []-typed arrays and, of course, on its argument.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Example 4 .Example 5 .</head><label>45</label><figDesc>Here is an instance of the coincidence simplification rule, where s is a term with j ∈ Loc(s): ({i := iV al || j := jV al} p[i](s)) ({i := iV al} p[i](s)) The coincidence simplification rule allows to prove the motivating example on p. 28 easily: in nonNullArray(a) → {j := j + 1} nonNullArray(a) we use nonNullArray[\for T [] a, int i; a[i]] as introduced in Example 3. For j ∈ Loc(a) an instance of this rule simplifies {j := j + 1} nonNullArray[. . .](a) nonNullArray[. . .](a) rendering the implication trivially valid.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>right</head><label></label><figDesc>Subtree at n5 is reachable from the root n1 via fields left and right in exactly 2 steps: reach[\for Tree t; t.left;\for Tree t; t.right](n1, n5, 2)</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head></head><label></label><figDesc>{\for int i; aCopy[i] := a0[i] || \for int i; a0[i] := get0(a, i)} perm[. . .](a0, aCopy) → {b10 := F ALSE || b4 := T RU E || b5 := F ALSE || . . . || \for int i; aCopy[i] := a0[i] || \for int i; a0[i] := get0(a, i) || a0[idx1] := get0(a0, idx2) || a0[idx2] := get0(a0, idx1)} perm[. . .](a0, aCopy)</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_0"><head></head><label></label><figDesc>T n is a predicate symbol (analogous for function symbols) -A set of states S where each S ∈ S contains an interpretation I nr completing the partial interpretation I 0 to a total interpretation I := I 0 ∪I nr by assigning a meaning to all non-rigid symbols. -The state transition relation ρ defining the programs' semantics, where for a program p and two states S 1 , S 2 ∈ S the relation ρ(p)(S 1 , S 2 ) holds if and only if executing p in state S 1 terminates in the final state S 2 . As ODL programs are deterministic the final state is unique whenever it exists.</figDesc><table /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_1"><head></head><label></label><figDesc>meaning all T -typed array component locations with indexes between 0 and the array length.3  -\for Tree t; t.left ; \for Tree t; t.right capturing all left and right locations of Tree-typed elements.</figDesc><table /><note>Definition 13 (Location Descriptor Extension). Let K := (M, S, ρ) be an ODL Kripke structure with universe D = T ∈T D(T ). The extension of a location descriptor ld = \for x 1 , . . . , x n ; \if (Φ) l(t 1 , . . . , t n ) in a given state S ∈ S is defined as the set of semantic locations:</note></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_2"><head></head><label></label><figDesc>Two updates U 1 , U 2 are called equivalent if they induce the same state transformer in any Kripke structure. Then every update U that has no anonymous program update as a component is equivalent to an update of the form upP art 1 || . . . || upP art len with upP art i</figDesc><table /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_3"><head></head><label></label><figDesc>Let φ be an arbitrary formula, K a Kripke structure, S a state in K, U as in Lemma 2 with g i ∈ Loc(φ) for all i then(K, S) |= φ iff (K, S) |= {U}φThis lemma guarantees the correctness of the following rule. Definition 19 (Coincidence Simplification Rule). {U} k[ld](s 1 , . . . , s n ) {U } k[ld](s 1 , . . . , s n ) where U := U − {upP art i | g i ∈ Loc(k[ld](s 1 , . . . , s n ))} and U as in Lemma 2.</figDesc><table><row><cell>Lemma 3.</cell><cell></cell><cell></cell></row><row><cell></cell><cell></cell><cell>symbol,</cell></row><row><cell></cell><cell></cell><cell>but not a location symbol</cell></row><row><cell></cell><cell></cell><cell>and without explicit dep.</cell></row><row><cell>Loc(U)</cell><cell cols="2">:= len i=1 (Loc(g i (u i )) ∪ Loc(τ i ) U as in Lemma 2</cell></row><row><cell></cell><cell>∪ Loc(val i ))</cell><cell></cell></row><row><cell>Loc(ω c )</cell><cell>:= FSym loc</cell><cell>see Defs. 2, 10</cell></row><row><cell>Loc({U}ξ)</cell><cell>:= Loc(U) ∪ Loc(ξ)</cell><cell>ξ a formula or term</cell></row></table></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="4" xml:id="foot_0">This case study has been joint work and is also reported in<ref type="bibr" target="#b18">[19]</ref>, where the focus was an improved loop invariant rule.</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="5" xml:id="foot_1">Slightly simplified and beautified.</note>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Acknowledgments</head><p>We thank Philipp Rümmer and Wolfgang Ahrendt for valuable comments. Special thanks go also to Benjamin Weiß for valuable comments and in particular for pointing out a problem in the original version of Def. 8. We thank the anonymous referees for their valuable comments.</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Event based sequential program development: Application to constructing a pointer program</title>
		<author>
			<persName><forename type="first">J</forename></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. Formal Methods</title>
				<editor>
			<persName><forename type="first">K</forename><surname>Araki</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">S</forename><surname>Gnesi</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">D</forename><surname>Mandrioli</surname></persName>
		</editor>
		<meeting>Formal Methods</meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2003-09">September 2003</date>
			<biblScope unit="volume">2805</biblScope>
			<biblScope unit="page" from="51" to="74" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Practical reasoning about invocations and implementations of pure methods</title>
		<author>
			<persName><forename type="first">K</forename><forename type="middle">R M</forename><surname>Ádám ; Darvas</surname></persName>
		</author>
		<author>
			<persName><surname>Leino</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Fundamental Approaches to Software Engineering (FASE)</title>
				<editor>
			<persName><forename type="first">M</forename><forename type="middle">B</forename><surname>Dwyer</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">A</forename><surname>Lopes</surname></persName>
		</editor>
		<imprint>
			<publisher>Springer-Verlag</publisher>
			<date type="published" when="2007">2007</date>
			<biblScope unit="volume">4422</biblScope>
			<biblScope unit="page" from="336" to="351" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Verification of Object-Oriented Software: The KeY Approach</title>
		<author>
			<persName><forename type="first">B</forename><surname>Beckert</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Hähnle</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Schmitt</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">LNCS</title>
		<imprint>
			<biblScope unit="volume">4334</biblScope>
			<date type="published" when="2006">2006</date>
			<publisher>Springer-Verlag</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Dynamic logic with non-rigid functions: A basis for object-oriented program verification</title>
		<author>
			<persName><forename type="first">B</forename><surname>Beckert</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Platzer</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. Intl. Joint Conference on Automated Reasoning</title>
				<editor>
			<persName><forename type="first">U</forename><surname>Furbach</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">N</forename><surname>Shankar</surname></persName>
		</editor>
		<meeting>Intl. Joint Conference on Automated Reasoning<address><addrLine>Seattle, USA</addrLine></address></meeting>
		<imprint>
			<publisher>Springer-Verlag</publisher>
			<date type="published" when="2006">2006</date>
			<biblScope unit="volume">4130</biblScope>
			<biblScope unit="page" from="266" to="280" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Local reasoning about a copying garbage collector</title>
		<author>
			<persName><forename type="first">L</forename><surname>Birkedal</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><surname>Torp-Smith</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Reynolds</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. 31st ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (POPL)</title>
				<meeting>31st ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (POPL)</meeting>
		<imprint>
			<publisher>ACM Press</publisher>
			<date type="published" when="2004-01">Jan. 2004</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Proving pointer programs in Hoare logic</title>
		<author>
			<persName><forename type="first">R</forename><surname>Bornat</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Mathematics of Program Construction</title>
				<editor>
			<persName><forename type="first">R</forename><forename type="middle">C</forename><surname>Backhouse</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">J</forename><forename type="middle">N</forename><surname>Oliveira</surname></persName>
		</editor>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2000">2000</date>
			<biblScope unit="volume">1837</biblScope>
			<biblScope unit="page" from="102" to="126" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Combining algebraic and algorithmic reasoning: An approach to the Schorr-Waite algorithm</title>
		<author>
			<persName><forename type="first">M</forename><surname>Broy</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Pepper</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ACM Trans. Program. Lang. Syst</title>
		<imprint>
			<biblScope unit="volume">4</biblScope>
			<biblScope unit="issue">3</biblScope>
			<biblScope unit="page" from="362" to="381" />
			<date type="published" when="1982">1982</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<monogr>
		<title level="m" type="main">Formal Verification of Recursive Predicates</title>
		<author>
			<persName><forename type="first">R</forename><surname>Bubel</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2007-06">June 2007</date>
		</imprint>
		<respStmt>
			<orgName>Fakultät für Informatik, Univ. Karlsruhe</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">PhD thesis</note>
</biblStruct>

<biblStruct xml:id="b8">
	<monogr>
		<title level="m" type="main">A Discipline of Programming</title>
		<author>
			<persName><forename type="first">E</forename><forename type="middle">W</forename><surname>Dijkstra</surname></persName>
		</author>
		<imprint>
			<date type="published" when="1976">1976</date>
			<publisher>Prentice-Hall</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">Dynamic Logic</title>
		<author>
			<persName><forename type="first">D</forename><surname>Harel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Kozen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Tiuryn</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Foundations of Computing</title>
				<imprint>
			<publisher>MIT Press</publisher>
			<date type="published" when="2000-10">Oct. 2000</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">An axiomatic basis for computer programming</title>
		<author>
			<persName><forename type="first">C</forename><forename type="middle">A R</forename><surname>Hoare</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Communications of the ACM</title>
		<imprint>
			<biblScope unit="volume">12</biblScope>
			<biblScope unit="issue">10</biblScope>
			<biblScope unit="page">583</biblScope>
			<date type="published" when="1969-10">Oct. 1969</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">A case study of C source code verification: the Schorr-Waite algorithm</title>
		<author>
			<persName><forename type="first">T</forename><surname>Hubert</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Marché</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. 3rd IEEE International Conference on Software Engineering and Formal Methods (SEFM)</title>
				<editor>
			<persName><forename type="first">B</forename><forename type="middle">K</forename><surname>Aichernig</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">B</forename><surname>Beckert</surname></persName>
		</editor>
		<meeting>3rd IEEE International Conference on Software Engineering and Formal Methods (SEFM)</meeting>
		<imprint>
			<publisher>IEEE Press</publisher>
			<date type="published" when="2005">2005</date>
			<biblScope unit="page" from="190" to="199" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">Dynamic frames: Support for framing, dependencies and sharing without restrictions</title>
		<author>
			<persName><forename type="first">I</forename><forename type="middle">T</forename><surname>Kassios</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="s">Lecture Notes in Computer Science</title>
		<editor>J. Misra, T. Nipkow, and E. Sekerinski</editor>
		<imprint>
			<biblScope unit="volume">4085</biblScope>
			<biblScope unit="page" from="268" to="283" />
			<date type="published" when="2006">2006</date>
			<publisher>Springer</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<monogr>
		<title level="m" type="main">JML Reference Manual</title>
		<author>
			<persName><forename type="first">G</forename><forename type="middle">T</forename><surname>Leavens</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Poll</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Clifton</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Y</forename><surname>Cheon</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Ruby</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Cok</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Müller</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Kiniry</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Chalin</surname></persName>
		</author>
		<idno>1.200</idno>
		<imprint>
			<date type="published" when="2007-02">Feb. 2007</date>
		</imprint>
	</monogr>
	<note>Draft revision</note>
</biblStruct>

<biblStruct xml:id="b14">
	<monogr>
		<title level="m" type="main">Toward Reliable Modular Programs</title>
		<author>
			<persName><forename type="first">K</forename><forename type="middle">R M</forename><surname>Leino</surname></persName>
		</author>
		<imprint>
			<date type="published" when="1995">1995</date>
		</imprint>
		<respStmt>
			<orgName>Caltech</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">PhD thesis</note>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title level="a" type="main">Proving pointer programs in higher-order logic</title>
		<author>
			<persName><forename type="first">F</forename><surname>Mehta</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Nipkow</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Automated Deduction -CADE-19</title>
				<editor>
			<persName><forename type="first">F</forename><surname>Baader</surname></persName>
		</editor>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2003">2003</date>
			<biblScope unit="volume">2741</biblScope>
			<biblScope unit="page" from="121" to="135" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b16">
	<analytic>
		<title level="a" type="main">Separation logic: A logic for shared mutable data structures</title>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">C</forename><surname>Reynolds</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. 17th Annual IEEE Symposium on Logic in Computer Science</title>
				<meeting>17th Annual IEEE Symposium on Logic in Computer Science</meeting>
		<imprint>
			<publisher>IEEE Computer Society</publisher>
			<date type="published" when="2002">2002</date>
			<biblScope unit="page" from="55" to="74" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<analytic>
		<title level="a" type="main">Sequential, parallel, and quantified updates of first-order structures</title>
		<author>
			<persName><forename type="first">P</forename><surname>Rümmer</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. Logic for Programming, Artificial Intelligence and Reasoning</title>
				<editor>
			<persName><forename type="first">M</forename><surname>Hermann</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">A</forename><surname>Voronkov</surname></persName>
		</editor>
		<meeting>Logic for Programming, Artificial Intelligence and Reasoning<address><addrLine>Phnom Penh, Cambodia</addrLine></address></meeting>
		<imprint>
			<publisher>Springer-Verlag</publisher>
			<date type="published" when="2006">2006</date>
			<biblScope unit="volume">4246</biblScope>
			<biblScope unit="page" from="422" to="436" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b18">
	<monogr>
		<title level="m" type="main">Symbolic Execution as a Framework for Deductive Verification of Object-Oriented Programs</title>
		<author>
			<persName><forename type="first">S</forename><surname>Schlager</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2007-02">Feb. 2007</date>
		</imprint>
		<respStmt>
			<orgName>Fakultät für Informatik, Univ. Karlsruhe</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">PhD thesis</note>
</biblStruct>

<biblStruct xml:id="b19">
	<analytic>
		<title level="a" type="main">An efficient machine-independent procedure for garbage collection in various list structures</title>
		<author>
			<persName><forename type="first">H</forename><surname>Schorr</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W</forename><forename type="middle">M</forename><surname>Waite</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Commun. ACM</title>
		<imprint>
			<biblScope unit="volume">10</biblScope>
			<biblScope unit="issue">8</biblScope>
			<biblScope unit="page" from="501" to="506" />
			<date type="published" when="1967">1967</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b20">
	<monogr>
		<title level="m" type="main">Verification of the schorr-waite graph marking algorithm by refinement</title>
		<author>
			<persName><forename type="first">H</forename><surname>Yang</surname></persName>
		</author>
		<ptr target="http://ropas.kaist.ac.kr/hyang/paper/dagstuhl-SW.pdf" />
		<imprint>
			<date type="published" when="2003">2003</date>
		</imprint>
	</monogr>
	<note type="report_type">Unpublished</note>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
