|
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
(1) -> X:=Product(IntegerMod 3,Set PF 3)
Type: Type
fricas
size()$X
Type: NonNegativeInteger
?
fricas
[index(i)$X for i in 1..size()$X::PositiveInteger]
fricas
Compiling function G3 with type NonNegativeInteger -> Boolean
Type: List(Product(IntegerMod
?(3),
Set(PrimeField
?(3))))
fricas
reduce(_and,[(lookup(index(i)$X)=i)::Boolean for i in 1..size()$X::PositiveInteger])
Type: Boolean
fricas
lookup(construct(2,[2])$X)
fricas
[random()$X for i in 1..5]
Type: List(Product(IntegerMod
?(3),
Set(PrimeField
?(3))))