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}
-
-\begin{spad}
-)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
- 
-  T == add
- 
-    --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,[2])$X)
lookup(construct(2,[2])$X)

This domain implements cartesian product, we give example usage here:

fricas
X:=Product(IntegerMod 3,Set PF 3)

\label{eq1}\hbox{\axiomType{Product}\ } (\hbox{\axiomType{IntegerMod}\ } (3) , \hbox{\axiomType{Set}\ } (\hbox{\axiomType{PrimeField}\ } (3)))(1)
Type: Type
fricas
size()$X

\label{eq2}24(2)
Type: NonNegativeInteger?
fricas
[index(i)$X for i in 1..size()$X::PositiveInteger]
fricas
Compiling function G675 with type NonNegativeInteger -> Boolean

\label{eq3}\begin{array}{@{}l}
\displaystyle
\left[{\left[ 1, \:{\left\{ \right\}}\right]}, \:{\left[ 1, \:{\left\{ 1 \right\}}\right]}, \:{\left[ 1, \:{\left\{ 2 \right\}}\right]}, \:{\left[ 1, \:{\left\{ 1, \: 2 \right\}}\right]}, \:{\left[ 1, \:{\left\{ 0 \right\}}\right]}, \:{\left[ 1, \:{\left\{ 1, \: 0 \right\}}\right]}, \: \right.
\
\
\displaystyle
\left.{\left[ 1, \:{\left\{ 2, \: 0 \right\}}\right]}, \:{\left[ 1, \:{\left\{ 1, \: 2, \: 0 \right\}}\right]}, \:{\left[ 2, \:{\left\{ \right\}}\right]}, \:{\left[ 2, \:{\left\{ 1 \right\}}\right]}, \:{\left[ 2, \:{\left\{ 2 \right\}}\right]}, \:{\left[ 2, \:{\left\{ 1, \: 2 \right\}}\right]}, \right.
\
\
\displaystyle
\left.\:{\left[ 2, \:{\left\{ 0 \right\}}\right]}, \:{\left[ 2, \:{\left\{ 1, \: 0 \right\}}\right]}, \:{\left[ 2, \:{\left\{ 2, \: 0 \right\}}\right]}, \:{\left[ 2, \:{\left\{ 1, \: 2, \: 0 \right\}}\right]}, \:{\left[ 0, \:{\left\{ \right\}}\right]}, \: \right.
\
\
\displaystyle
\left.{\left[ 0, \:{\left\{ 1 \right\}}\right]}, \:{\left[ 0, \:{\left\{ 2 \right\}}\right]}, \:{\left[ 0, \:{\left\{ 1, \: 2 \right\}}\right]}, \:{\left[ 0, \:{\left\{ 0 \right\}}\right]}, \:{\left[ 0, \:{\left\{ 1, \: 0 \right\}}\right]}, \:{\left[ 0, \:{\left\{ 2, \: 0 \right\}}\right]}, \: \right.
\
\
\displaystyle
\left.{\left[ 0, \:{\left\{ 1, \: 2, \: 0 \right\}}\right]}\right] (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])

\label{eq4} \mbox{\rm true} (4)
Type: Boolean
fricas
lookup(construct(2,[2])$X)

\label{eq5}11(5)
Type: PositiveInteger?
fricas
[random()$X for i in 1..5]

\label{eq6}\left[{\left[ 0, \:{\left\{ 2, \: 0 \right\}}\right]}, \:{\left[ 2, \:{\left\{ 1 \right\}}\right]}, \:{\left[ 0, \:{\left\{ 1, \: 2, \: 0 \right\}}\right]}, \:{\left[ 1, \:{\left\{ 1 \right\}}\right]}, \:{\left[ 2, \:{\left\{ 1, \: 2 \right\}}\right]}\right](6)
Type: List(Product(IntegerMod?(3),Set(PrimeField?(3))))