comp.lang.ada
 help / color / mirror / Atom feed
From: stefan-lucks@see-the.signature
Subject: Re: Silly and stupid post‑condition or not ?
Date: Wed, 1 Feb 2012 17:37:28 +0100
Date: 2012-02-01T17:37:28+01:00	[thread overview]
Message-ID: <Pine.LNX.4.64.1202011604270.29918@medsec1.medien.uni-weimar.de> (raw)
In-Reply-To: <k4q0w3hid5t6$.12146xli5l156$.dlg@40tude.net>

On Wed, 1 Feb 2012, Dmitry A. Kazakov wrote:

> On Wed, 1 Feb 2012 11:37:31 +0100, stefan-lucks@see-the.signature wrote:
> 
> > 1. For the purpose of proving program correctness,
> 
> Proving incorrectness, you mean, since the thing is partial.

With apologies to you and all the c.l.a readers, there was a really bad 
typo in my example. So here is the correct example

     function F(X: Natural) return Natural 
        with Post => (if (X mod 2) = 1 then ...); 

So any program, which's correctness depends on a statement such as 

     Y := F(X) * (X mod 2); -- not "F(X) * (F(X) mod 2)", as I wrote before

may be proven correct (there is nothing "partial" here), in spite of the 
incomplete postcondition for F. 

I.e., value of Y is predictable. If X is odd, one needs the postcondition 
to predict Y. If X is even, then Y is 0, regardless of the value of F(X). 
But note that I follow the SPARK-inspired assumption that for even X, F(X) 
can be any value of the given type, but computing F(X) must not propagate 
an exception!

I didn't actually try it, but I am sure that I could verify the 
correctness of a SPARK program with such a structure. Of course, SPARK 
would still force me to actually prove that F doesn't raise an exception, 
even for the case of X being even. Furthermore, the good thing about SPARK 
is that it would have thrown a bunch of unprovable verification conditions 
at me, had I tried to verify the example with the typo. 

Unfortunately, Ada 2012 lacks a way to specify a subprogram not to 
propagate an exception (*). Waiting for Ada 2020! 

> > 2. Sometimes, it may hard to prove the entire contract. So we will try to 
> >    prove the "important" requirements in the contract, and try to convince 
> >    ourselves by conventional means (testing, code review, ...) that other
> >    requirements are also satisfied.
> [...]
> 
> No. In that case, and this was my point, the thing must be designed in a
> way which clearly distinguished the provable/specified/defined part from
> the rest. I proposed to introduce Length_Error to indicate a contracted
> error case.

I see. However, I would claim that an incomplete postcondition actually 
"distinguishes the provable/specified/defined part from the rest", as you 
put it. E.g., specifying (or even better, proving)

  procedure Ask_Database(U: User; Q: Query; R: out Response)
    with post(if (not Authorized(U)) and (Asks_For_Secret_Stuff(Q)) 
              then R=Empty_Response);

for some applications would be a big deal, even though there are four 
different cases for the postcondition (any combination of the Booleans 
Authorized(U) and Asks_For_Secret_Stuff(Q), and only one of these four 
cases is formally specified. 

---- 
(*) Of course, by the language's own means, without gnatmem or some other 
    tool, one can actually be never really sure about Storage_Error ...

-- 
---- Stefan.Lucks (at) uni-weimar.de, University of Weimar, Germany ----
    <http://www.uni-weimar.de/cms/medien/mediensicherheit/home.html> 
------     I love the taste of Cryptanalysis in the morning!      ------




  reply	other threads:[~2012-02-01 16:35 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-30 23:11 Silly and stupid post‑condition or not ? Yannick Duchêne (Hibou57)
2012-01-31  6:47 ` J-P. Rosen
2012-01-31 18:48   ` Jeffrey Carter
2012-01-31 22:02     ` Yannick Duchêne (Hibou57)
2012-01-31  8:54 ` Dmitry A. Kazakov
2012-01-31  9:35   ` Georg Bauhaus
2012-01-31 10:22     ` Dmitry A. Kazakov
2012-01-31 12:33       ` Georg Bauhaus
2012-01-31 13:52         ` Dmitry A. Kazakov
2012-01-31 15:34           ` Georg Bauhaus
2012-01-31 16:24             ` Dmitry A. Kazakov
2012-01-31 19:44               ` Georg Bauhaus
2012-02-01  8:41                 ` Dmitry A. Kazakov
2012-02-01 10:37                   ` stefan-lucks
2012-02-01 10:51                     ` Yannick Duchêne (Hibou57)
2012-02-01 13:49                     ` Yannick Duchêne (Hibou57)
2012-02-01 13:49                     ` Dmitry A. Kazakov
2012-02-01 16:37                       ` stefan-lucks [this message]
2012-02-02  1:50                         ` Silly and stupid post�?'condition " Randy Brukardt
2012-02-02  1:56                           ` Silly and stupid postâ?'condition or not ? Yannick Duchêne (Hibou57)
2012-02-03  2:45                             ` Silly and stupid post�?'condition or not ? Randy Brukardt
2012-02-02  8:25                         ` Silly and stupid post‑condition " Dmitry A. Kazakov
2012-02-02  9:01                           ` stefan-lucks
2012-02-02  9:18                           ` stefan-lucks
2012-02-02 10:04                             ` Dmitry A. Kazakov
2012-01-31 22:08         ` Yannick Duchêne (Hibou57)
2012-01-31 17:28 ` Dmitry A. Kazakov
2012-01-31 22:12   ` Yannick Duchêne (Hibou57)
2012-02-01  8:49     ` Dmitry A. Kazakov
2012-02-01  8:36 ` Stephen Leake
2012-02-01 16:30   ` Silly and stupid post-condition " Adam Beneschan
2012-02-02  9:40     ` Stephen Leake
2012-02-02 13:20       ` Georg Bauhaus
2012-02-02 13:35         ` Yannick Duchêne (Hibou57)
2012-02-03  3:13       ` Randy Brukardt
2012-02-03  3:33         ` Yannick Duchêne (Hibou57)
2012-02-03  8:12         ` Simon Wright
2012-02-07  2:29           ` BrianG
2012-02-07 10:43             ` Simon Wright
2012-02-08  2:25               ` BrianG
2012-02-07 21:15             ` Robert A Duff
2012-02-03  9:11         ` Dmitry A. Kazakov
2012-02-04  3:27           ` Randy Brukardt
2012-02-04 10:15             ` Dmitry A. Kazakov
2012-02-03 12:25         ` Phil Thornley
2012-02-04  9:30         ` Phil Thornley
2012-02-04 12:02         ` Phil Thornley
2012-02-05  6:18           ` Randy Brukardt
2012-02-05 10:23             ` Phil Thornley
2012-02-05 10:55               ` Yannick Duchêne (Hibou57)
2012-02-05 15:03               ` Robert A Duff
2012-02-05 18:04                 ` Phil Thornley
2012-02-05 21:27                   ` Robert A Duff
2012-02-05 23:09                     ` Phil Thornley
2012-02-07  2:05               ` Randy Brukardt
2012-02-07  9:38                 ` Dmitry A. Kazakov
2012-02-05 11:31             ` Yannick Duchêne (Hibou57)
2012-02-05 14:50             ` Robert A Duff
2012-02-07  2:11               ` Randy Brukardt
2012-02-07  2:34             ` BrianG
2012-02-07  4:38               ` Yannick Duchêne (Hibou57)
2012-02-09  3:10               ` Randy Brukardt
2012-02-04 23:07         ` Stephen Leake
2012-02-05  2:49           ` Yannick Duchêne (Hibou57)
2012-02-05  6:29           ` Randy Brukardt
2012-02-05 11:40             ` Yannick Duchêne (Hibou57)
2012-02-07  1:36               ` Randy Brukardt
2012-02-05 15:16             ` Robert A Duff
2012-02-06  4:56               ` Yannick Duchêne (Hibou57)
2012-02-06 14:39                 ` Robert A Duff
2012-02-06 16:12                   ` Yannick Duchêne (Hibou57)
2012-02-07  1:46               ` Randy Brukardt
2012-02-07 17:24                 ` Robert A Duff
2012-02-03  6:26       ` J-P. Rosen
2012-02-03  9:12         ` Dmitry A. Kazakov
2012-02-03  9:48           ` Yannick Duchêne (Hibou57)
2012-02-03 11:09             ` Dmitry A. Kazakov
2012-02-03 11:40               ` Yannick Duchêne (Hibou57)
2012-02-03 13:18                 ` Dmitry A. Kazakov
2012-02-03 14:14                   ` Yannick Duchêne (Hibou57)
2012-02-03 14:45                     ` Dmitry A. Kazakov
2012-02-04  3:16           ` Randy Brukardt
2012-02-04  6:27             ` Yannick Duchêne (Hibou57)
2012-02-04 10:47             ` Dmitry A. Kazakov
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox