--* From RMC%WATSON.vnet.ibm.com@yktvmv.watson.ibm.com  Thu May 26 16:44:20 1994
--* Received: from yktvmv-ob.watson.ibm.com by asharp.watson.ibm.com (AIX 3.2/UCB 5.64/930311)
--*           id AA20990; Thu, 26 May 1994 16:44:20 -0400
--* Received: from watson.vnet.ibm.com by yktvmv.watson.ibm.com (IBM VM SMTP V2R3)
--*    with BSMTP id 2453; Thu, 26 May 94 16:44:20 EDT
--* Received: from YKTVMV by watson.vnet.ibm.com with "VAGENT.V1.0"
--*           id <A.RMC.NOTE.VAGENT2.2669.May.26.16:44:17.-0400>
--*           for asbugs@watson; Thu, 26 May 94 16:44:20 -0400
--* Received: from YKTVMV by watson.vnet.ibm.com with "VAGENT.V1.0"
--*           id 2657; Thu, 26 May 1994 16:44:17 EDT
--* Received: from matteo.watson.ibm.com by yktvmv.watson.ibm.com (IBM VM SMTP V2R3)
--*    with TCP; Thu, 26 May 94 16:44:07 EDT
--* Received: by matteo.watson.ibm.com (AIX 3.2/UCB 5.64/920123)
--*           id AA18309; Thu, 26 May 1994 16:41:48 -0400
--* Date: Thu, 26 May 1994 16:41:48 -0400
--* From: rmc@matteo.watson.ibm.com
--* Message-Id: <9405262041.AA18309@matteo.watson.ibm.com>
--* To: asbugs@watson.ibm.com
--* Subject: [3] needed flexibility [none][35.0]

--@ Fixed  by:  SSD   Fri Jun 3 10:30:09 EDT 1994 
--@ Tested by:  none 
--@ Summary:    Not a bug. You can use '(3@RoundedRational * x)' to disambiguate. Add macros to taste. 


--+ I would like to be able to reference literals like 1, 2, 3, ... in polynomials
--+ and have them automatically be treated as RoundedRationals.
--+
--+ Ok, we can export integer:Literal -> % where integer(i:Literal):%==integer(i)$I::%.
--+
--+ Now since R is a ring we must export *(Integer,%) +--> %.
--+
--+ So what does  3*x mean if x is a RoundedRational?  It could mean Integer * RoundedRational,
--+ or it could mean RoundedRational*RoundedRational.
--+
--+ Both of these are the same, of course.  But A# doesn't know that.
--+
--+ Currently I get round this by making R ==> RoundedRational(SingleInteger, 10) and
--+ not importing Integer.  But this is a cheat.
--+
--+ And it is a fragile one at that, because things will break if I have to import Integer
--+ for any reason.
--+
--+ Suggested solution 1:  A compiler switch that says "pick one" of any ambiguous meanings.
--+                        If the meanings are in fact the same, this is what you want to do.
--+
--+                        I can't think of a single example offhand where this wouldn't be
--+                        what you want.
--+
--+ Suggested solution 2:  Don't bother with a switch, just make A# do that and warn the user.
--+
--+ Suggested solution 3:  Make literals members of type "any" or type "user" or some other
--+                        abdication of the idea of strong typing.  (I don't think this one
--+                        will fly, myself).
--+
--+ 		   4:  Teach A# that some things are equivalent:  SingleInteger <= Integer <=
--+ 			RoundedRational, hence integer*RoundedRational = RoundedRational as
--+ 			we expect.  That is, automatic coercion to the highest type.  I suspect
--+ 			this one is the ``real'' solution.  Talking through my hat though as
--+ 			I probably don't understand the issues involved in making it happen.
--+ 			This is in some sense equivalent to solution #1 except that instead
--+ 			of picking a random meaning, A# would look for the ``highest'' meaning.
--+
--+ Some red herring:
--+   3*matrix --> integer * matrix because unless matrix was 1 by 1 matrix*matrix wouldn't work;
--+
--+   Picking a random meaning is dangerous without the warnings in the case things ARE different.
--+
 
