login  home  contents  what's new  discussion  bug reports help  links  subscribe  changes  refresh  edit

# Edit detail for Cartesian Product revision 4 of 4

 1 2 3 4 Editor: test1 Time: 2018/04/13 15:35:04 GMT+0 Note:

changed:
-++ This domain implements cartesian product
-
-\begin{axiom}
-)show Product
-\end{axiom}
-
-)abbrev domain PRODUCT Product
-Product (A:SetCategory,B:SetCategory) : C == T
- where
-  C == SetCategory  with
-       if A has Finite and B has Finite then Finite
-       if A has Monoid and B has Monoid then Monoid
-       if A has AbelianMonoid and B has AbelianMonoid then AbelianMonoid
-       if A has CancellationAbelianMonoid and
-          B has CancellationAbelianMonoid then CancellationAbelianMonoid
-       if A has Group  and B has Group  then  Group
-       if A has AbelianGroup and B has AbelianGroup then  AbelianGroup
-       if A has OrderedAbelianMonoidSup and B has OrderedAbelianMonoidSup
-                                             then OrderedAbelianMonoidSup
-       if A has OrderedSet and B has OrderedSet then  OrderedSet
-
-       makeprod     : (A,B) -> %
-        ++ makeprod(a,b) \undocumented
-       selectfirst  :   %   -> A
-        ++ selectfirst(x) \undocumented
-       selectsecond :   %   -> B
-        ++ selectsecond(x) \undocumented
-
-
-    --representations
-       Rep := Record(acomp:A,bcomp:B)
-
-    --declarations
-       x,y: %
-       i: NonNegativeInteger
-       p: NonNegativeInteger
-       a: A
-       b: B
-       d: Integer
-
-    --define
-       coerce(x):OutputForm == paren [(x.acomp)::OutputForm,
-                                      (x.bcomp)::OutputForm]
-       x=y ==
-           x.acomp = y.acomp => x.bcomp = y.bcomp
-           false
-       makeprod(a:A,b:B) :%   == [a,b]
-
-       selectfirst(x:%) : A   == x.acomp
-
-       selectsecond (x:%) : B == x.bcomp
-
-       if A has Monoid and B has Monoid then
-          1 == [1$A,1$B]
-          x * y == [x.acomp * y.acomp,x.bcomp * y.bcomp]
-          x ** p == [x.acomp ** p ,x.bcomp ** p]
-
-       if A has Finite and B has Finite then
-          size == size$A * size$B
-          index(n) == [index((((n::Integer-1) quo size$B )+1)::PositiveInteger)$A,
-                       index((((n::Integer-1) rem size$B )+1)::PositiveInteger)$B]
-          random() == [random()$A,random()$B]
-          lookup(x) == ((lookup(x.acomp)$A::Integer-1) * size$B::Integer +
-                        lookup(x.bcomp)$B::Integer)::PositiveInteger - hash(x) == hash(x.acomp)$A * size$B::SingleInteger + hash(x.bcomp)$B
-
-       if A has Group and B has Group then
-          inv(x) == [inv(x.acomp),inv(x.bcomp)]
-
-       if A has AbelianMonoid and B has AbelianMonoid then
-          0 == [0$A,0$B]
-
-          x + y == [x.acomp + y.acomp,x.bcomp + y.bcomp]
-
-          c:NonNegativeInteger * x == [c * x.acomp,c*x.bcomp]
-
-       if A has CancellationAbelianMonoid and
-          B has CancellationAbelianMonoid then
-            subtractIfCan(x, y) : Union(%,"failed") ==
-              (na:= subtractIfCan(x.acomp, y.acomp)) case "failed" => "failed"
-              (nb:= subtractIfCan(x.bcomp, y.bcomp)) case "failed" => "failed"
-              [na::A,nb::B]
-
-       if A has AbelianGroup and B has AbelianGroup then
-          - x == [- x.acomp,-x.bcomp]
-          (x - y):% == [x.acomp - y.acomp,x.bcomp - y.bcomp]
-          d * x == [d * x.acomp,d * x.bcomp]
-
-       if A has OrderedAbelianMonoidSup and B has OrderedAbelianMonoidSup then
-          sup(x,y) == [sup(x.acomp,y.acomp),sup(x.bcomp,y.bcomp)]
-
-       if A has OrderedSet and B has OrderedSet then
-          x < y ==
-               xa:= x.acomp ; ya:= y.acomp
-               xa < ya => true
-               xb:= x.bcomp ; yb:= y.bcomp
-               xa = ya => (xb < yb)
-               false
-
---     coerce(x:%):Symbol ==
---      PrintableForm()
---      formList([x.acomp::Expression,x.bcomp::Expression])$PrintableForm -\end{spad} This domain implements cartesian product, we give example usage here: changed: -lookup(makeprod(2,)$X)
lookup(construct(2,)$X)  This domain implements cartesian product, we give example usage here: fricas X:=Product(IntegerMod 3,Set PF 3) (1) Type: Type fricas size()$X (2)
Type: NonNegativeInteger?
fricas
[index(i)$X for i in 1..size()$X::PositiveInteger]
fricas
Compiling function G675 with type NonNegativeInteger -> Boolean (3)
Type: List(Product(IntegerMod?(3),Set(PrimeField?(3))))
fricas
reduce(_and,[(lookup(index(i)$X)=i)::Boolean for i in 1..size()$X::PositiveInteger]) (4)
Type: Boolean
fricas
lookup(construct(2,)$X) (5) Type: PositiveInteger? fricas [random()$X for i in 1..5] (6)
Type: List(Product(IntegerMod?(3),Set(PrimeField?(3))))