39
Theorem Proving One of the problems with model checking based methods is that they can be applied only to finite state systems. However, reasoning about infinite state systems is equally important and methods must be developed which enable a modeller to ”attack the infinite”. However, the combined use of theorem proving and model checking is justified because they examine ALL BEHAVIOURS rather than simulation which do only a partial check. The biggest problem with theorem proving is its steep learning curve. It takes about 6 months to master a good automated theorem prover as PVS.

Theorem Proving

  • Upload
    olaf

  • View
    38

  • Download
    1

Embed Size (px)

DESCRIPTION

Theorem Proving. One of the problems with model checking based methods is that they can be applied only to finite state systems. However, reasoning about infinite state systems is equally important and methods must be developed which enable a modeller to ”attack the infinite”. - PowerPoint PPT Presentation

Citation preview

Page 1: Theorem Proving

Theorem Proving• One of the problems with model checking based methods is that

they can be applied only to finite state systems.

• However, reasoning about infinite state systems is equally important and methods must be developed which enable a modeller to ”attack the infinite”.

• However, the combined use of theorem proving and model checking is justified because they examine ALL BEHAVIOURS rather than simulation which do only a partial check.

• The biggest problem with theorem proving is its steep learning curve. It takes about 6 months to master a good automated theorem prover as PVS.

Page 2: Theorem Proving

Theorem Proving - Definition• Theorem proving could be defined as follows (Rushby 99)“Specify the system, a required property, the assumptions, and

necessary background theories as formulas in a single logic.

Prove that background + assumptions + system is a model of the property. “

• Theorem Proving works best on data intensive systems

Page 3: Theorem Proving

Theorem Proving compared with Model Checking (from Rushby 99)

• When theorem proving is used, the system is not restricted to finite-state (or even to a transition system)!!

• The required property is not restricted to invariance or eventuality properties that can be expressed in Computation Tree Logic (CTL)

• The assumptions are not restricted to fairness assumptions, but rather, they can be arbitrary theories

• However, with the increased freedom in logics and theories comes less automation and more involved human involvement in proofs

Page 4: Theorem Proving

PVS Briefly• PVS is a verification system. It provides a general purpose

specification language integrated with a theorem prover, model checker and other tools

• PVS can be obtained free of charge for non-commercial purposes from SRI (URL = http://www.csl.sri.com/pvs.html)

• PVS runs on SunOS, Solaris, IBM AIX, and Linux

• PVS has been applied in several areas: safety-critical systems, hardware, distributed algorithms, and mathematics

• The use of PVS is best illustrated through an example that follows

Page 5: Theorem Proving

Cache Coherency protocol (Futurebus+) (Rushby 99)

• A multiprocessor system consists of several processes and a shared memory

• Each process maintains a local cache of the memory, and the state of this copy changes as memory is being written to, etc.

• Each change made by any processor must be reflected in other processors’ cache as well to maintain the notion of coherency

P1 P2 P3 P4 P5

MEM

Page 6: Theorem Proving

Cache Coherency - 2• The memory is organized into lines and for the purposes of this

study, it is sufficient to consider the status changes of only a single line

• Each line has a status in a processor’s cache: 1. If a line status is INVALID, the line is not present in this cache2. If a line status is SHARED, the line is present in a read-only mode3. If a line status is EXCLUSIVE, the line is present for read-write

access

• There are three key memory operations1. Read-shared: get a shared copy of the line2. Read-modified: get an exclusive copy of the line3. Write-back: give up the exclusive copy

Page 7: Theorem Proving

Cache Coherency - 3• For the protocol to be correct, we should show that at most one

processor has an exclusive copy of a single line in its cache

cache_array[N : posnat]: THEORY BEGIN processor : TYPE = below(N) line_status: TYPE = {invalid, shared, exclusive} transactions: TYPE = {idle, read_shared, read_modified,

write_back}

protocol_state : TYPE = [# cache : [processor -> line_status], transaction : transactions, bus_master : processor #]

Page 8: Theorem Proving

Cache Coherency - 4 ps, ps0, ps1: VAR protocol_state

p_next(ps0, ps1): bool = LET p = bus_master(ps0), t = transaction(ps0) IN (idle?(t) AND do_idle(ps0, ps1)) OR (read_shared?(t) AND do_read_shared(ps0, ps1)(p)) OR (read_modified?(t) AND do_read_modified(ps0, ps1)(p)) OR (write_back?(t) AND do_write_back(ps0, ps1)(p))

do_idle(ps0, ps1): bool = (ps1 = ps0)

** The Bus Master is the process that initiated the current event on the bus *

Page 9: Theorem Proving

Cache Coherency - 5 p, q, r: VAR processor

do_read_shared(ps0, ps1)(p): bool = invalid?(cache(ps0)(p)) AND shared?(cache(ps1)(p)) AND ((EXISTS q: exclusive?(cache(ps0)(q)) AND NOT exlusive?(cache(ps1)(q)) AND (FORALL r: r/=q IMPLIES exclusive?(cache(ps1)(r )) = exclusive?(cache(ps0)(r )))) OR (FORALL q: NOT exclusive?(cache(ps0)(q)) AND NOT exclusive?(cache(ps1)(q))))

** This transition allows reading of a line in memory when no one has an exclusive copy of the line in its cache

Page 10: Theorem Proving

Cache Coherency - 6 do_read_modified(ps0, ps1)(p): bool = shared?(cache(ps0)(p)) AND (FORALL q: cache(ps1)(q) = IF p = q THEN exclusive ELSIF shared?(cache(ps0)(q)) THEN invalid ELSE cache(ps0)(q) ENDIF)

** This transition makes the bus master exclusive, and invalidates all those processes who had a read access to the memory line

Page 11: Theorem Proving

Cache Coherency - 7 do_write_back(ps0, ps1)(p): bool = exclusive?(cache(ps0)(p)) AND cache(ps1) = cache(ps0) WITH [(p) := invalid]

** This function shows how the exclusive right is given up by the bus master

Page 12: Theorem Proving

Initial State and Invariant assertions• The next task is to identify the initial states and the alleged

properties we want to verify.

p_init(ps): bool = FORALL p: invalid?(cache(ps)(p))

p_safe(ps): bool = FORALL p, q; exclusive?(cache(ps)(p)) AND exclusive?(cache(ps)

(q)) IMPLIES p = q

invariant: THEOREM (p_init(ps) IMPLIES p_safe(ps)) AND (p_safe(ps0) AND p_next(ps0, ps1) IMPLIES

p_safe(ps1))

Page 13: Theorem Proving

What does theorem proving look like?• Now, the only thing to do is to actually prove our initial conjecture

or come up with a counterexample. This is what the theorem prover PVS looks like in action

invariant: |----------- {1} (FORALL (ps, ps0, ps1: protocol_state): (p_init(ps) IMPLIES p_safe(ps)) AND (p_safe(ps0) AND p_next(ps0, ps1) IMPLIES p_safe(ps1))) Rule?

Page 14: Theorem Proving

PVS in action - 1• When the above goal is simplified with (skosimp) and

(ground) which stand for skolemization and simplifying and propositional simplification, respectively, we get the following output:

This yields 2 subgoals: invariant.1: {-1} p_init(ps!1) |--------- {1} p_safe(ps!1) Rule?

This branch of the proof is discharged with the strategy (grind)

Page 15: Theorem Proving

PVS in action - 2• We continue with our proof and get the following

This completes the proof of invariant.1 {-1} p_safe(ps0!1) {-2} p_next(ps0!1, ps1!1) |--------- {1} p_safe(ps1!1) Rule?

Now the applications of (expand “p_next”) and (ground) are used to divide the above problem to four cases.

Page 16: Theorem Proving

PVS in action - 3 Applying propositional simplification and decision procedures this yields 4 subgoals: invariant 2.1: {-1} idle?(transaction(ps0!1)) {-2} do_idle(ps0!1, ps1!1) [-3] p_safe(ps0!1) |-------- [1] p_safe(ps1!1) Rule?

• The above goal is proved by the (grind) strategy

Page 17: Theorem Proving

PVS in action - 4• Similarly, the last invariant can be proved as follows:

invariant.2.4: {-1} write_back?(transaction(ps0!1)) {-2} do_write_back(ps0!1, ps1!1)(bus_master(ps0!1)) [-3] p_safe(ps0!1) |---------- [1] p_safe(ps1!1) Rule?

• This is proved by using the strategy (grind :if-match all)

Page 18: Theorem Proving

PVS in action - 5invariant.2.2: {-1} read_shared?(transaction(ps0!1)) {-2} do_read_shared(ps0!1, ps1!1)(bus_master(ps0!1)) [-3] p_safe(ps0!1) |------------ [1] p_safe(ps1!1) Rule?

Page 19: Theorem Proving

PVS in action - 6• The previous theorem is proven by the following interactive proof:

(grind :if-match NIL) ((“1” (inst –8 “q!2”) (assert) (inst –9 “q!1”) (assert) (inst –9 “q!2”) (assert)) (“2” (inst –6 “p!1”) (assert)))

Page 20: Theorem Proving

PVS in action -7invariant.2.3:{-1} read_modified?(transaction(ps0!1)){-2} do_read_modified(ps0!1, ps1!1) (bus_master(ps0!1))[-3] p_safe(ps1!1) |----------[1] p_safe(ps1!1)Rule?

• This proof is once again started with (grind :if-match NIL) but we run into a difficulty that we can’t solve

Page 21: Theorem Proving

PVS in action - 8{-1} q!1 < N{-2} p!1 < N[-3] read_modified?(transaction(ps0!1)){-4} shared?(cache(ps0!1)(bus_master(ps0!1))){-5} FORALL (q: processor): cache (ps1!1) (q) = IF bus_master(ps0!1) = q THEN exclusive ELSIF shared?(cache(ps0!1)(q)) THEN invalid ELSE cache(ps0!1)(q) ENDIF{-6} FORALL (p: processor): exclusive?(cache(ps0!1)(p)) IMPLIES FORALL (q: processor): exclusive?(cache(ps0!1)(q)) IMPLIES p=q{-7} exclusive?(cache(ps1!1)(p!1)){-8} exclusive?(cache(ps1!1)(q!1)) |-----------------{1} p!1 = q!1

Page 22: Theorem Proving

PVS in action - 9• The problem with the previous slide is that our specification

doesn’t say anything about a situation where a read_modified transaction is executed when someone is already in exclusive state

• However, this is in effect impossible, but to show it formally, we need to strengthen our safety invariant as follows: If any processor has exclusive status, all the others must be invalid

strong_p_safe(ps): bool = FORALL p: exclusive?(cache(ps)(p)) IMPLIES FORALL q: q/=p IMPLIES invalid?(cache(ps)(q))

strong_invariant: THEOREM (p_init(ps) IMPLIES strong_p_safe(ps)) AND (strong_p_safe(ps0) AND p_next(ps0, ps1) IMPLIES strong_p_safe(ps1))

Page 23: Theorem Proving

PVS and transition systems• One of the most powerful, yet easy to grasp ideas in theoretical

computer science is that of transition systems

• PVS has been adapted in such a way that it can handle the specification of transition systems as TABLES

• The example we will consider here relates to a car’s cruise control system. Grab your seat and have fun!! ;)

Page 24: Theorem Proving

PVS and transition systems –2 • The SCR method consists of state machines that interact with

their environment by periodically sampling the values of monitored variables (i.e. inputs) and producing controlled variables (i.e. outputs).

• The state of an individual state machine is a mode

• Condition is a predicate on monitored variables (I.e. inputs)

• Event occurs when a monitored variable changes its value

Page 25: Theorem Proving

PVS and transition systems - 3 scr[ input, mode, output: TYPE ]: THEORY BEGIN condition: TYPE = pred[input] event: TYPE = pred[[input, input]] state: TYPE = [# mode: mode, vars: input #]

transition_relation: TYPE = pred[[state, state]]

mode_table: TYPE = [mode, input, input -> mode]

(notice that the new mode is specified as the function of the previous

mode and the previous and the current inputs)

Page 26: Theorem Proving

PVS and transition systems - 4 trans (mt: mode_table): transition_relation = (LAMBDA (s, t: state): mode(t) = mt(mode(s), vars(s),

vars(t)))

** the above definition constructs the transition relation from the mode table

output_table: TYPE = [mode, input, input -> output]

** the output table is constructed also from the previous mode and the previous and current inputs.

Page 27: Theorem Proving

PVS and transition systems - 5The next task is to define what event constructors are

event_constructor: TYPE = [condition -> event] EC: TYPE = event_constructor

p, q: VAR input P: VAR condition

atT(P)(p, q): bool = NOT P(p) & P(q) atF(P)(p, q): bool = P(p) & NOT P(q) T(P)(p, q): bool = P(p) & P(q) F(P)(p, q): bool = NOT P(p) & NOT P(q) dc(P)(p, q): bool = true

Page 28: Theorem Proving

PVS and transition systems - 6• The previous stuff was all preamble to the problem at hand.

Here’s the definition of the car cruise control system

cruise: THEORY BEGIN lever_pos: TYPE = {activate, deactivate, resume} engine_state: TYPE = {off, ignition, running} monitored_vars: TYPE = [# engine: engine_state, toofast: bool, brake: bool, lever: lever_pos #]

Page 29: Theorem Proving

PVS and transition systems - 7 modes: TYPE = { off, inactive, cruise, override } null: TYPE IMPORTING scr[ monitored_vars, modes, null]

** next we must start to define the conditions accordingly

activate:condition= LAMBDA (m:monitored_vars): activate?(lever(m))resume: condition= LAMBDA (m:monitored_vars): resume?(lever(m))running:condition= LAMBDA (m: monitored_vars): running?

(engine(m))Ignited:condition= LAMBDA (m:monitored_vars): ignition?(engine(m)) OR running?

(engine(m))

Page 30: Theorem Proving

PVS and transition systems - 8 brake: condition = LAMBDA (m: monitored_vars): brake(m) toofast:condition = LAMBDA (m: monitored_vars):

toofast(m)

Then we will describe the rows of the table. To do that, we must define the notion of PC or pairwise conjunction. It is defined as a collection of functions that each take a list of event constructors and a list of conditions and conjoins their pairwise applications.

PC(A)(a)(p, q): bool = A(a)(p, q) PC(A, B)(a, b)(p, q): bool = A(a)(p,q) & B(b)(p, q) … PC(A, B, C, D, E, FF, G)(a, b, c, d, e, f, g)(p, q): bool = A(a)(p,

q) & B(b)(p, q) & … & G(g)(p, q)

Page 31: Theorem Proving

PVS and transition systems - 9original(s: modes, (p, q: monitored_vars)): modes =LET x: conds7 = (ignited, running, toofast, brake, activate,

deactivate, resume), X = (LAMBDA (a,b,c,d,e,f,g: EC): PC(a,b,c,d,e,f,g)(x)(p, q)) IN TABLE s |off| TABLE %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( atT, dc, dc, dc, dc, dc, dc) | inactive || %-----|-----|-----|-----|-----|-----|-----|------|--------------|| | ELSE | off || %-----|------------------------------------------|--------------|| ENDTABLE ||

Page 32: Theorem Proving

PVS and transition systems – 10|inactive| TABLE %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( atF , dc , dc , dc , dc , dc , dc) | off

|| %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( T , T , dc , F , atT , dc , dc) | cruise

|| %-----|-----|-----|-----|-----|-----|-----|------|--------------|| | ELSE |

inactive || %------|------------------------------------------|--------------|| ENDTABLE

Page 33: Theorem Proving

PVS and transition systems - 11|cruise| TABLE %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( atF , dc , dc , dc , dc , dc , dc) | off || %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( dc , atF , dc , dc , dc , dc , dc) | inactive || %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( dc , dc , atT, dc , dc , dc , dc) | inactive || %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( dc , dc , dc , atT, dc , dc , dc) | override || %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( dc , dc , dc , dc , dc , atT , dc) | override || %-----|-----|-----|-----|-----|-----|-----|------|--------------|| | ELSE | cruise || %------|------------------------------------------|--------------|| ENDTABLE ||

Page 34: Theorem Proving

PVS and transition systems - 12|override| TABLE %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( atF , dc , dc , dc , dc , dc , dc) | off || %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( dc , atF , dc , dc , dc , dc , dc) | inactive || %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( T , T , dc , F , atT, dc , dc) | cruise || %-----|-----|-----|-----|-----|-----|-----|------|--------------|| |X( T , T , dc , F , dc , dc , atT) | cruise || %-----|-----|-----|-----|-----|-----|-----|------|--------------|| | ELSE | override || %------|------------------------------------------|--------------|| ENDTABLE ||

Page 35: Theorem Proving

PVS and transition systems - 13** One more definition needed for the example to run is

conds1:type = [condition] conds2:type = [condition, condition] … conds7:type = [condition, condition, condition, condition,

condition, condition, condition]

Page 36: Theorem Proving

PVS and transition systems - 14• When we typecheck the above description, a number of TCCs

(Type Correctness Conditions) are generated and each one must be discharged by the theorem prover

• However, our table as is does not exhibit completely deterministic behaviour. We get the following sequent in proof:

Trying repeated skolemization, instantiation, and if-lifting this yields 8 subgoals: original_TCC2.1 : {-1} cruise?(s!1) {-2} toofast(q!1) {-3} deactivate?(lever(q!1)) |---------- {1} toofast(p!1) {2} deactivate?(lever(p!1))Rule?

Page 37: Theorem Proving

PVS and transition systems - 15• The problem on the last slide was that in cruise state the eventuality

that toofast and deactivate both go from FALSE to TRUE is ambiguous

• In the spec, the first causes a transition to inactive mode, and the second one a transition to override mode.

• The problem is circumvented when we add the condition that toofast be FALSE when a transition from cruise to override mode are taken

• Also, the transition to inactive need to be conditioned on ignited staying TRUE.

• We should also use the axiom engine_prop: AXIOM toofast(p) => running(p)

Page 38: Theorem Proving

PVS and transition systems - 16• Once these changes are made, the TCCs may be proven by

(then (grind)(lemma “engine_prop”)(grind :if-match all))

• Once the TCCs have been discharged by PVS, we know that our resulting table is deterministic.

• 16 slides to say this simple thing !! ? !! I take the blame, alright.

Page 39: Theorem Proving

Conclusion• Theorem proving is much more labour intensive than model

checking

• However, theorem proving provides the verification engineer with a way to attack the infinite by e.g. induction axioms and all theorems from set theory, and natural numbers.

• I warmly suggest that you take a look at the web pages of PVS and start to learn it while you study. You never know, after a couple of years, people who can do theorem proving might be the hottest studs in the job market !