comp.lang.ada
 help / color / mirror / Atom feed
From: Georg Bauhaus <rm.dash-bauhaus@futureapps.de>
Subject: Re: On pragma Precondition etc.
Date: Wed, 30 Jul 2008 19:45:03 +0200
Date: 2008-07-30T19:45:04+02:00	[thread overview]
Message-ID: <4890a8a0$0$11740$9b4e6d93@newsspool1.arcor-online.net> (raw)
In-Reply-To: <1lt840f6z5lva.8rilgn0ds47u$.dlg@40tude.net>

Dmitry A. Kazakov schrieb:
> On Wed, 30 Jul 2008 11:06:16 +0200, Georg Bauhaus wrote:

>> (1) the precursor's contract-type (up the derivation hierarchy)
>> (2) the profile
>>
>> So given
>>
>>     function Foo(X, Y: Integer) return Whatever;
>>
>> denote the precondition of its "contract-type" by something like
>>
>>     Foo'Precondition;
> 

> 
> In presence of:
> 
>    subtype My_Integer is Integer range 1..500;
>    type My_Whatever is new Whatever with private;
> 
> what are the preconditions of Foo defined on the tuples:
> 
> Integer x My_Integer x Whatever
> My_Integer x Integer x Whatever
  [some more combinations]

Any preconditions are those that you specify, of course.
They don't magically start to exist[*], and DbC adds no
magic for excluding subtle contradictions. Of course,
Boolean expressions involving the subprogram parameters
will be checked by the compiler. Just like with Ada; they
are checked now,

    pragma Precondition(<boolean expression>);

with some rules for what can be part of <boolean expression>.
No more, no less.

Now the rules that say how preconditions are to be logically
connected when overriding. Go ahead!  First,
do you want a derived object to be a suitable argument for a
parent's procedure? With or without preconditions, arguments
may meet both: the type constraints that Ada has to offer,
and the DbC constraints. Let's see,


    type Whatever is tagged private;

    procedure Foo(Item: Whatever);
      -- pre: permissible values of Item


    type My_Whatever is new Whatever with private;

    overriding
    procedure Foo(Item: My_Whatever);
      --  pre: permissible values at least as above

    X: Whatever'Class := ...;
begin

    Foo(X);

end;

In this case object X must satisfy the parent's preconditions
for calling Foo and the child's preconditions for calling its
Foo.  So the rule would be to "weaken" the precondition in child
overridings. The phrase "at least" from the comment on the
overridden Foo translates into "or else". Theory then says,
"When overriding, only add permissible values, do not remove any."

For extended records I find this rule strikingly obvious, because
every component added to the parent type will enlarge the set of
values available in the child type.

Seen in this light,  range 1 ... 500 takes away values
from Integer'range.  (Not surprisingly, since it is a constraint.)

    subtype My_Integer is Integer range 1 .. 500;

    overriding
    procedure Bar(Item: My_Whatever; Num: My_Integer);

With or without DbC, it seems reasonable to me to expect
that Bar fails when it gets an argument for Num outside
range 1 .. 500.  Say it fails with a Constraint_Error.

This exceptional behavior is already illustrating why the DbC
idea of having a 'Constraint on a type makes sense.  It is
already working for subtypes now.

With or without DbC, you can always be troubled by the typical
variance problems, for which, as you  have said before, there is
no universally good solution.  Many shrug when they
are more busy with the practical benefits of DbC.



___
[*] Sofcheck's tools can extract a number of assertions.
There is also an Eiffel(?) tool doing similar things.
But this is beside the point when you want to design a
provable DbC component (typically, a tagged type).
It adds nothing in the sense of DbC, just more assertions
for us that help with analyzing our programs which would
typically lack assertions.



  reply	other threads:[~2008-07-30 17:45 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-25  8:01 On pragma Precondition etc Georg Bauhaus
2008-07-25 10:50 ` stefan-lucks
2008-07-25 11:05   ` mockturtle
2008-07-25 11:44     ` Alex R. Mosteo
2008-07-25 11:56       ` Georg Bauhaus
2008-07-28  8:02         ` Alex R. Mosteo
2008-07-29 11:18       ` Martin Krischik
2008-07-29 12:08         ` Dmitry A. Kazakov
2008-07-29 14:19           ` Georg Bauhaus
2008-07-29 14:49             ` Georg Bauhaus
2008-07-29 15:00             ` Dmitry A. Kazakov
2008-07-29 15:14               ` Georg Bauhaus
2008-07-29 15:55               ` Georg Bauhaus
2008-07-29 17:49                 ` Dmitry A. Kazakov
2008-07-30  9:06                   ` Georg Bauhaus
2008-07-30 13:47                     ` Dmitry A. Kazakov
2008-07-30 17:45                       ` Georg Bauhaus [this message]
2008-07-31  8:12                         ` Dmitry A. Kazakov
2008-07-31 23:06                           ` Georg Bauhaus
2008-08-01  8:40                             ` Dmitry A. Kazakov
2008-07-30  9:22                   ` Georg Bauhaus
2008-07-30 13:56                     ` Dmitry A. Kazakov
2008-07-25 14:39   ` Robert A Duff
2008-07-25 16:50 ` Pascal Obry
replies disabled

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