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) axiom (INT,INT) Type: Tuple Domain
axiom List Any
Type: Domain
axiom DirectProduct(2,Any)
Type: Domain
axiom Tuple Any Type: Tuple Domain
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: Domain
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
Any suggestions --billpage, Wed, 29 Jun 2005 01:43:26 -0500 reply 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.Type: Void
axiom f3(x) == *(x) Type: Void
axiom f3(f1(5)) axiom Compiling function f3 with type Tuple Integer -> Integer
There are no library operations named * having 1 argument(s) though
there are 34 exposed operation(s) and 23 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.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 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 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
Type: PositiveInteger
axiom f3:Tuple INT -> INT Type: Void
axiom f3(x) == reduce(*,[select(x,i::NNI) for i in 0..length(x)-1]) Type: Void
axiom f3(a) axiom Compiling function f3 with type Tuple Integer -> Integer axiom Compiling function G1490 with type Integer -> Boolean
Type: PositiveInteger
axiom f3(f1(5))
Type: PositiveInteger
axiom f3((1,2,3,4)::Tuple INT)
Type: PositiveInteger
axiom f3 [1,2,3,4]
Type: PositiveInteger
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 I do not know why in the design of One final puzzle: In axiom output messages for (9) above, what is the axiom )clear all 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
Type: PositiveInteger
axiom f3(a)
Type: PositiveInteger
and there is no such function. Also, 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
Type: OutputForm
axiom coerce(a)@PRIMARR INT
Type: PrimitiveArray? Integer
This "bug" may be due to the Interpreter coercing 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
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 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 This is issue is the result of lack of abstraction rampant in both the compiler and interpreter. More precisely, there is no proper separation between the internal name used to tag internal ASTs? and name used for category/domain constructor. Tuple is both the name of a constructor and the tag given to an AST that represents tuples. As a consequence the semantics analyzer cannot disguish between when Tupel is effectively used a domain constructor, as opposed to just the name of a tag. Display problem fixed in OpenAxiom-1.1.1 and later. Looking at the original report, the notation (INT,INT) does not necessarily designate a type. It does so only in a very specific cases. However, in general, it designates an object that is not of domain type, just like [INT,INT]? is not a domain. |