--* From BMT%WATSON.vnet.ibm.com@yktvmh.watson.ibm.com  Thu Oct 14 10:21:18 1993
--* Received: from yktvmh.watson.ibm.com by radical.watson.ibm.com (AIX 3.2/UCB 5.64/900524)
--*           id AA22447; Thu, 14 Oct 1993 10:21:18 -0400
--* Received: from watson.vnet.ibm.com by yktvmh.watson.ibm.com (IBM VM SMTP V2R3)
--*    with BSMTP id 6859; Thu, 14 Oct 93 10:27:45 EDT
--* Received: from YKTVMH by watson.vnet.ibm.com with "VAGENT.V1.0"
--*           id <A.BMT.NOTE.VAGENT2.5251.Oct.14.10:27:43.-0400>
--*           for asbugs@watson; Thu, 14 Oct 93 10:27:45 -0400
--* Received: from YKTVMH by watson.vnet.ibm.com with "VAGENT.V1.0"
--*           id 5247; Thu, 14 Oct 1993 10:27:42 EDT
--* Received: from cyst.watson.ibm.com by yktvmh.watson.ibm.com (IBM VM SMTP V2R3)
--*    with TCP; Thu, 14 Oct 93 10:27:40 EDT
--* Received: from spadserv.watson.ibm.com by cyst.watson.ibm.com (AIX 3.2/UCB 5.64/900528)
--*   id AA53950; Thu, 14 Oct 1993 10:27:02 -0400
--* Received: by spadserv.watson.ibm.com (AIX 3.2/UCB 5.64/900524)
--*           id AA20253; Thu, 14 Oct 1993 10:28:53 -0400
--* Date: Thu, 14 Oct 1993 10:28:53 -0400
--* From: bmt@spadserv.watson.ibm.com
--* X-External-Networks: yes
--* Message-Id: <9310141428.AA20253@spadserv.watson.ibm.com>
--* To: asbugs@watson.ibm.com
--* Subject: duplicate error reported for line 153 [/spad/local/asharp/bugs/bug266.as][31.3 (current)]

--@ Fixed  by:  SSD   Wed Nov 2 14:41:42 EST 1994 
--@ Tested by:  none 
--@ Summary:    Duplicate symbol meanings appearing in error message fixed. 


--* From BMT%WATSON.vnet.ibm.com@yktvmh.watson.ibm.com  Tue May 18 06:33:41 1993
--* Received: from yktvmh.watson.ibm.com by radical.watson.ibm.com (AIX 3.2/UCB 5.64/900524)
--*           id AA26507; Tue, 18 May 1993 06:33:41 -0400
--* Received: from watson.vnet.ibm.com by yktvmh.watson.ibm.com (IBM VM SMTP V2R3)
--*    with BSMTP id 0818; Tue, 18 May 93 06:34:03 EDT
--* Received: from YKTVMH by watson.vnet.ibm.com with "VAGENT.V1.0"
--*           id <A.BMT.NOTE.VAGENT2.7454.May.18.06:34:02.-0400>
--*           for asbugs@watson; Tue, 18 May 93 06:34:02 -0400
--* Received: from YKTVMH by watson.vnet.ibm.com with "VAGENT.V1.0"
--*           id 7452; Tue, 18 May 1993 06:34:02 EDT
--* Received: from cyst.watson.ibm.com by yktvmh.watson.ibm.com (IBM VM SMTP V2R3)
--*    with TCP; Tue, 18 May 93 06:34:01 EDT
--* Received: from spadserv.watson.ibm.com by cyst.watson.ibm.com (AIX 3.2/UCB 5.64/900528)
--*   id AA49796; Tue, 18 May 1993 06:34:03 -0400
--* Received: by spadserv.watson.ibm.com (AIX 3.2/UCB 5.64/900524)
--*           id AA15265; Tue, 18 May 1993 06:35:40 -0400
--* Date: Tue, 18 May 1993 06:35:40 -0400
--* From: bmt@spadserv.watson.ibm.com
--* X-External-Networks: yes
--* Message-Id: <9305181035.AA15265@spadserv.watson.ibm.com>
--* To: asbugs@watson.ibm.com
--* Subject: compiler error trying to redefine function sup from added domain [dirprod3.as][28.9 (current)]

--@ Fixed  by:  SSD   Wed Nov 2 14:41:42 EST 1994 
--@ Tested by:  none 
--@ Summary:    Duplicate symbol meanings appearing in error message fixed. 


#include "aslib.as"
macro SI == SingleInteger
macro S == SingleInteger

OrderedDirectProduct(dim: SI, lessThan?: (Array S, Array S) -> Boolean):
   OrderedDirectProductCat
 == add
   Rep ==> Array(S)
   import from Rep
   import from S
   map(f:S-> S, v: %):% ==
         vv:Rep := new(dim,0)
         for i: SI in 1..dim repeat
            set!(vv, i, f apply(v,i))
         per vv

   map(f:(S,S) -> S, v1:%, v2:%) :% ==
         vv:Rep := new(dim,0)
         for i: SI in 1..dim repeat
            set!(vv, i, f(apply(v1,i), apply(v2,i)))
         per vv

   vector(ts : Tuple S): % ==
                w := new(dim,0)
                for i in 1..min(length ts,dim) repeat w.i := element(ts, i)
                per w

   unitVector(i:SI):% ==
          v:= new(dim,0)
          v.i := 1
          per v

   0:% == per new(dim,0)
   1:% == per new(dim,1)
   (v1:%) = (v2:%):Boolean == rep(v1) = rep(v2)
   (v1:%) ~= (v2:%):Boolean == rep(v1) ~= rep(v2)
   (v1:%) < (v2:%):Boolean == lessThan?(rep(v1), rep(v2))
   (v1:%) > (v2:%):Boolean == v2 < v1
   (v1:%) <= (v2:%):Boolean == not(v2 < v1)
   (v1:%) >= (v2:%):Boolean == not(v1 < v2)

   (v1:%) + (v2:%):% == map(+, v1, v2)
   (v1:%) - (v2:%):% == map(-, v1, v2)
   (- (v:%)):% == map(-, v)
   sum(v:%):S ==
      s:S:=0
      for vv in rep v repeat s := s+vv
      s
   sup(v1:%, v2:%):% ==
     map((%1:S,%2:S):S +-> if %1<%2 then %2 else %1, v1, v2)
   apply(v:%, s:SI):S == rep(v).s
   nonNegative?(v:%):Boolean ==
      for i:SI in 1..dim repeat
        if v(i)<0 then return false
      true
   apply(p: OutPort, v: %): OutPort ==
       dim=0 => p "()"

       p("(")(v.1)
       for i in 2..dim repeat p(",")(v.i)
       p(")")



macro
  qelt == apply
  VS   == Array SS

OrderingFunctions(dim: SI, SS: OrderedAbelianMonoid): with
     pureLex    :  (VS,VS)  -> Boolean
     totalLex   :  (VS,VS)  -> Boolean
     reverseLex :  (VS,VS)  -> Boolean
     gradRevLex :  (VS,VS)  -> Boolean

  == add
    import from SS
    n:SI:=dim

 -- pure lexicographical ordering
    pureLex(v1:VS,v2:VS) : Boolean ==
      for i in 1..n repeat
        if qelt(v1,i) < qelt(v2,i) then return true
        if qelt(v2,i) < qelt(v1,i) then return false
      false

 -- total ordering refined with lex
    totalLex(v1:VS,v2:VS) :Boolean ==
      n1:SS:=0
      n2:SS:=0
      for i in 1..n repeat
        n1:= n1+qelt(v1,i)
        n2:=n2+qelt(v2,i)
      n1<n2 => true
      n2<n1 => false
      for i in 1..n repeat
        if qelt(v1,i) < qelt(v2,i) then return true
        if qelt(v2,i) < qelt(v1,i) then return false
      false

 -- reverse lexicographical ordering
    reverseLex(v1:VS,v2:VS) :Boolean ==
      n1:SS:=0
      n2:SS:=0
      for i in 1..n repeat
        n1:= n1+qelt(v1,i)
        n2:=n2+qelt(v2,i)
      n1<n2 => true
      n2<n1 => false
      for i in n..1 by -1 repeat
        if qelt(v2,i) < qelt(v1,i) then return true
        if qelt(v1,i) < qelt(v2,i) then return false
      false

 -- reverse lexicographical ordering assuming total degree in first position
    gradRevLex(v1:VS,v2:VS) :Boolean ==
      n1:= qelt(v1,1)
      n2:= qelt(v2,1)
      n1<n2 => true
      n2<n1 => false
      for i in n..2 by -1 repeat
        if qelt(v2,i) < qelt(v1,i) then return true
        if qelt(v1,i) < qelt(v2,i) then return false
      false

HomogeneousDirectProduct(dim:SI): OrderedDirectProductCat ==
  OrderedDirectProduct(dim,reverseLex$OrderingFunctions(dim,SI)) add

GradedDirectProduct(dim:SI): OrderedDirectProductCat ==
  OrderedDirectProduct(dim+1,gradRevLex$OrderingFunctions(dim,SI)) add
     Rep ==>  OrderedDirectProduct(dim+1,gradRevLex$OrderingFunctions(dim,SI))
     import from Rep
     sup(e1:%, e2:%):% ==
        re := sup( rep e1, rep e2)
        s := sum(re) - re.1
        v:Array(SI) := re pretend Array(SI)
        v.1 := s
        v pretend %

LexicographicDirectProduct(dim:SI): OrderedDirectProductCat ==
  OrderedDirectProduct(dim,pureLex$OrderingFunctions(dim,SI)) add



 
