From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,e9dfe478ced46adc X-Google-NewGroupId: yes X-Google-Attributes: gida07f3367d7,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII Path: g2news1.google.com!news3.google.com!feeder.news-service.com!85.214.198.2.MISMATCH!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail From: "Alex Mentis" Newsgroups: comp.lang.ada Subject: Re: Abstract operator does not hide predefined operator Date: Fri, 12 Nov 2010 17:39:21 +0000 (UTC) Organization: A noiseless patient Spider Message-ID: References: <76885893-2ff1-4175-91c0-fb45b3dfbe15@o15g2000prh.googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Injection-Date: Fri, 12 Nov 2010 17:39:21 +0000 (UTC) Injection-Info: mx02.eternal-september.org; posting-host="2mHI2HcCGxZ3pXcuTAHRZQ"; logging-data="3253"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/Amic2SXyGetbsH2MnG5BLfrAW/C/7uZo=" User-Agent: XanaNews/1.19.1.269 Cancel-Lock: sha1:w9EZuckOIho/0rAyjLhGH5xyokQ= Xref: g2news1.google.com comp.lang.ada:15450 Date: 2010-11-12T17:39:21+00:00 List-Id: Adam Beneschan wrote: > On Nov 12, 7:04�am, Stefan.Lu...@uni-weimar.de wrote: > > Hi all, > > > > I've implemented a small generic package for modular arithmetic. > > Note that Ada's "mod N" types define addition subtraction and > > multiplication right, but use the integer division for "/" instead > > of the proper modular division, where A/B is A * Inverse(B). I also > > tried to get rid of the unary "not" operator, who's purpose I don't > > understand for general modular arithmetic. (I understand that it is > > useful if the modulus is a power of two, just like the binary xor > > operator.) > > > > This is the spec of my generic package: > > > > generic > > � �type Mod_T is mod <>; > > package Mod_Arith is > > � �type Modular is new Mod_T; > > � �function "/"(Left, Right: Modular) return Modular; > > � �function Inverse(Value: Modular) return Modular; > > � �function "not"(Value: Modular) return Modular is abstract; > > end Mod_Arith; > > > > For testing that package, I first instantiated it: > > > > � �type M3343 is mod 3343; > > � �package M is new Mod_Arith(Mod_T => M3343); > > � �use type M.Modular; > > � �S,T,U: M.Modular; > > > > (Sidenote: 3343 is a prime, so addition and multiplication over > > M.Modular are field operations, mathematically.) > > > > Now, my freshly defined division works as expected. The > > multiplication (and addition and subtraction) are inherited from > > the type M3343: > > > > � �S := 3; > > � �T := S/(2*S); -- T becomes the multiplicative Inverse of 2 mod > > 3343; � � � � � � � � �-- the same expression's result in M3343 > > would be zero. � �Ada.Text_IO.Put_Line(M.Modular'Image(T) & > > � � � � � � � � � � � � � M.Modular'Image(M.Inverse(2))); > > � �-- The output is "1672 1672", as expected. > > > > But, unfortunately, the compiler (gnat) also accepts the following: > > > > � �U := not S; -- this should not be possible, because the "not" > > operator � � � � � � � �-- has been defined abstract ... but > > instead, the � � � � � � � �-- predefined "not" from M3343 seems to > > be used � �Ada.Text_IO.Put_Line(M.Modular'Image(U)); > > � �-- The output is "3339", which actually is not(M3343(S)) = > > 3342-S. > > > > What can I do to get rid of the predefined "not"? If I change the > > "not" from an abstract function to a function always raising an > > exception, the statement > > > > � �U := not S; > > > > raises the desired exception. But I would prefer to be told at > > compile time that I must not use "not", rather than at run time. > > Also, I would prefer not to define the type Mod_Arith.Modular as a > > private type. > > > > Any ideas? > > This appears to be a GNAT bug; the inherited "not" subprogram of > Modular, which is inherited from the predefined function of M3343, > exists but should be hidden from all visibility, and therefore cannot > be a possible meaning of "not" in the expression "not S". So what > you're doing should work, I think. (P.S. I've confirmed that the > version of GNAT I'm using also accepts the program if I write out M > instead of making it a generic instantiation, and if I use "use" > instead of "use type". So neither of those appears to be an issue.) > > -- Adam Agree that it smells buggy. It seems that the problem only affects making unary operators abstract ("-" and "not"). Testing with "+", "-", "/", "*", "and", "or", and "xor" operators as abstract refused to compile as expected for me.