These error messages indicate some serious problems
with the Axiom Tuple domain:
System error: The function |Domain| is undefined.
The constructor Tuple takes 1 argument and you have given 2
Axiom allows functions to have a tuple as input but it
fails if a function generates two or more outputs.
For example:
axiom
f:(INT,INT)->INT
Type: Void
axiom
g:INT->(INT,INT)
The constructor Tuple takes 1 argument and you have given 2 .
axiom
(INT,INT)
LISP output:
(UNPRINTABLE UNPRINTABLE)
Type: Tuple(Type)
Tuple Any
should work in a similar way to List Any
and
DirectProduct(2,Any)
.
axiom
List Any
Type: Type
axiom
DirectProduct(2,Any)
Type: Type
axiom
Tuple Any
LISP output:
(UNPRINTABLE)
Type: Tuple(Type)
Axiom's non-homogeneous Record and Union domains are
functionally superior to the tuple construct but it makes
functional notation awkward. See [SandBox Direct Product]?
Try this (which gets around the error messages and bug):
axiom
a:Tuple INT
Type: Void
axiom
a:=(1,2,3,4)
Type: Tuple(Integer)
axiom
dom:=Tuple Any
Type: Type
axiom
b:dom:=(1::INT, 2::FLOAT,3::POLY INT)
Type: Tuple(Any)
axiom
h:INT->Tuple INT
Type: Void
axiom
h(x)==(x, 2+x)
Type: Void
axiom
h(5)
axiom
Compiling function h with type Integer -> Tuple(Integer)
Type: Tuple(Integer)
How to do composition of functions with two arguments and two outputs?
axiom
f1:INT->Tuple INT
Type: Void
axiom
f1(x)==(x,2+x)
Type: Void
axiom
f2:(INT,INT)->INT
Type: Void
axiom
f2(x,y)==x*y
Type: Void
axiom
f2(f1(4))
axiom
Compiling function f1 with type Integer -> Tuple(Integer)
There are no library operations named f2
Use HyperDoc Browse or issue
)what op f2
to learn if there is any operation containing " f2 " in its name.
Cannot find a definition or applicable library operation named f2
with argument type(s)
Tuple(Integer)
Perhaps you should use "@" to indicate the required return type,
or "$" to specify which version of the function you need.
f3:Tuple INT -> INT
Type: Void
axiom
f3(x) == *(x)
Type: Void
axiom
f3(f1(5))
There are no library operations named * having 1 argument(s) though
there are 35 exposed operation(s) and 24 unexposed operation(s)
having a different number of arguments. Use HyperDoc Browse, or
issue
)what op *
to learn what operations contain " * " in their names, or issue
)display op *
to learn more about the available operations.
Cannot find a definition or applicable library operation named *
with argument type(s)
Tuple(Integer)
Perhaps you should use "@" to indicate the required return type,
or "$" to specify which version of the function you need.
FriCAS will attempt to step through and interpret the code.
axiom
Compiling function f3 with type Tuple(Integer) -> Integer
There are no library operations named * having 1 argument(s) though
there are 35 exposed operation(s) and 24 unexposed operation(s)
having a different number of arguments. Use HyperDoc Browse, or
issue
)what op *
to learn what operations contain " * " in their names, or issue
)display op *
to learn more about the available operations.
Cannot find a definition or applicable library operation named *
with argument type(s)
Tuple(Integer)
Perhaps you should use "@" to indicate the required return type,
or "$" to specify which version of the function you need.
From: William Sit, July 1, 2005 06:26:00 -5:00
The following works (not as neat as it should be, of course)
axiom
f1:INT->Tuple INT
Compiled code for f1 has been cleared.
Type: Void
axiom
f1(x)==(x,2+x)
1 old definition(s) deleted for function or rule f1
Type: Void
axiom
f2:(INT,INT)->INT
Type: Void
axiom
f2(x,y)==x*y
1 old definition(s) deleted for function or rule f2
Type: Void
axiom
a:=f1(4)
axiom
Compiling function f1 with type Integer -> Tuple(Integer)
Type: Tuple(Integer)
axiom
f2(select(a,0), select(a,1))
axiom
Compiling function f2 with type (Integer,Integer) -> Integer
axiom
f3:Tuple INT -> INT
Compiled code for f3 has been cleared.
Type: Void
axiom
f3(x) == reduce(*,[select(x,i::NNI) for i in 0..length(x)-1])
1 old definition(s) deleted for function or rule f3
Type: Void
axiom
f3(a)
axiom
Compiling function f3 with type Tuple(Integer) -> Integer
axiom
Compiling function G700 with type Integer -> Boolean
axiom
f3(f1(5))
axiom
f3((1,2,3,4)::Tuple INT)
axiom
f3 [1,2,3,4]
axiom
f4:Tuple INT -> List INT
Type: Void
axiom
f4 x == concat(x::List INT, x::List INT)
Type: Void
axiom
f4(f1(5))
axiom
Compiling function f4 with type Tuple(Integer) -> List(Integer)
Type: List(Integer)
Note that neither f3(1,2,3,4)
nor f3((1,2,3,4))
works, even though tuples are lists without the square brackets, essentially. In both cases, the reason is probably the parser treats the arities differently. Recall that the Interpreter (and Axiom) treats parenthesis as "applied to" (so f3 (1,2,3,4)
is the same as applying f3
to 4 distinct arguments and f3(a)
is f3 a
). I do think the second form should have worked without the explicit coercion.
I do not know why in the design of Tuple S
, the parts are not to be referenced with just the usual list method like a.i
and must use select
. Also the indexing in Tuple S
starts with 0. In the very old days of Scratchpad, all aggregates indexing was zero based. Most are converted to one-based and you can have a choice. Somehow, Tuple S
was not updated to reflect this.
One final puzzle: In axiom output messages for (9) above, what is the G1433
(or whatever) function from Integer->Boolean
? I tried
axiom
)clear all
All user variables and function definitions have been cleared.
f3:Tuple INT->INT
Type: Void
axiom
f3 x == reduce(*,[select(x,i::NNI) for i in 0..length(x)-1])
Type: Void
axiom
a:Tuple INT:=(2,3)
Type: Tuple(Integer)
axiom
f3 a
axiom
Compiling function f3 with type Tuple(Integer) -> Integer
axiom
f3(a)
and there is no such function. Also, f3 a
actually works.
William
Why tuples are displayed as list ?
I prefer to read (2,3) or 2,3 for tuple, and [2,3] only for lists.
Students and I make errors when the display is the same, even if there is a type information.
From William Sit, Fri Jul 1 08:50:00 -0500 2005
There seems to be some bug in the display, because the code in Tuple (array1.spad) uses parenthesis, not brackets.
axiom
coerce(a)$Tuple INT
axiom
coerce(a)@PRIMARR INT
Type: PrimitiveArray
?(Integer)
This "bug" may be due to the Interpreter coercing Tuple INT
to PRIMARR INT
and then to OutputForm
, which perhaps uses the List output. The order of coercion may be governed by the conditional on coerce to Outputform
in Tuple S
(S
needs to be of SetCategory
).
William
See related discussion: [Tuples Products And Records]?
A named tuple cannot be assigned to a tuple of identifiers.
The last (commented out) line '[1 for (a,b) in g]
? seems to cause a freeze in Axiom; no output, not even if )set mess bot on. If you try it by uncommenting the line, you have to use cancel. (It should have reported syntax error similar to
(a,b):=f' (although there shouldn't be an error because
f
is of type
Tuple (Positive) Integer
. However, even
(a,b):=(f::Tuple Integer)
does not work.) This may be related to the convention that
select
rather than
apply
is used to get components in a tuple.
axiom
)clear all
All user variables and function definitions have been cleared.
g:=[(1,2),(3,4)]
Type: List(Tuple(PositiveInteger
?))
axiom
[(a:=e;(a,a)) for e in g]
Type: List(Tuple(Tuple(PositiveInteger
?)))
axiom
[((a,b):=(select(e,0),select(e,1));(a,a,b,c)) for e in g]
Type: List(Tuple(Polynomial(Integer)))
axiom
f:=g.1
Type: Tuple(PositiveInteger
?)
axiom
(a,b):=f
If there is a tuple on the left-hand side of an assignment then
there must also be one on the right-hand side.
On my system, the following message finally:
>> System error:
The storage for CONS is exhausted.
Currently, 85895 pages are allocated.
Use ALLOCATE to expand the space.
It's clearly an infinite loop.
Category: Axiom Programming => Axiom Compiler
Severity: serious => normal