|
|
|
last edited 18 years ago |
| 1 | ||
|
Editor: 127.0.0.1
Time: 2007/11/15 20:11:27 GMT-8 |
||
| Note: transferred from axiom-developer | ||
changed: - On Wednesday, January 12, 2005 12:00 PM you wrote: Ralf Hemmecke wrote: Well, I haven't checked whether it should really work, but shouldn't be:: Foo: with { g: (n: PositiveInteger, k: PositiveInteger) -> (P: PrimeFieldCategory, x: P) } == add { g(n: PositiveInteger, k: PositiveInteger ): (P: PrimeFieldCategory, x:P) == { (PrimeField(n), k::Integer::PrimeField(n) } } be even better? Later William Sit wrote: In fact you just pointed a way to solve the problem! Notice that you are in effect constructing a domain! So first create this domain (call this anything else you like) \begin{axiom} )abbrev domain PPF PointedPrimeField --%PointedPrimeField PointedPrimeField(n:PositiveInteger):Cat==Dog where Cat == FiniteFieldCategory with foo:PositiveInteger->PrimeField(n) Dog == PrimeField(n) add foo(k)==k::Integer::PrimeField(n) \end{axiom} After compiling, define in the interpreter \begin{axiom} g(n,k)==foo(k)$PPF(n) g(7,4) \end{axiom} and it works (in Axiom)! (Do not declare the types for g because n is not defined). Compiling g is still a problem in Axiom due to signature limitation. At least this way, inlining a complicated function is almost like a function call. The idea is: Since in creating domains (or any other types of constructors), we are in effect creating a function(the domain constructor PPF is a function of sorts, or functor) and the compiler can take dependent types in its signature,structurally:: PPF(n:PositiveInteger)==PrimeField(n) with foo so it should be able to compile something like g by lifting it to the package level. So here is another way using package. \begin{spad} )abbrev package FOO Foo Foo(n:PositiveInteger, k:Integer):with point:()->PrimeField(n) == add point()==k::PrimeField(n) \end{spad} After compiling, we can use:: point()$Foo(n,k) in any computation in compiler code (and in interpreter). In the interpreter you can call this bar(n,k): \begin{axiom} bar(n,k) == point()$Foo(n,k) bar(7,4) \end{axiom} Can someone give an example where the *signature* of bar:: bar: (n: PositiveInteger, k: PositiveInteger) -> PrimeField(n) is actually needed? \begin{spad} )abbrev package FOO2 Foo2 Foo2(n:PositiveInteger, k:IntegerMod(n)):with point:()->PrimeField(n) == add point()==convert(k)$IntegerMod(n)::PrimeField(n) \end{spad} \begin{axiom} point()$Foo2(13,2) \end{axiom}
On Wednesday, January 12, 2005 12:00 PM you wrote: Ralf Hemmecke wrote:
Well, I haven't checked whether it should really work, but shouldn't be:
Foo: with {
g: (n: PositiveInteger, k: PositiveInteger) ->
(P: PrimeFieldCategory, x: P)
} == add {
g(n: PositiveInteger, k: PositiveInteger ):
(P: PrimeFieldCategory, x:P) == {
(PrimeField(n), k::Integer::PrimeField(n)
}
}
be even better?
Later William Sit wrote:
In fact you just pointed a way to solve the problem! Notice that you are in effect constructing a domain! So first create this domain (call this anything else you like)
(1) -> )abbrev domain PPF PointedPrimeField --%PointedPrimeField PointedPrimeField(n:PositiveInteger):Cat==Dog where Cat == FiniteFieldCategory with foo:PositiveInteger->PrimeField(n) Dog == PrimeField(n) add foo(k)==k::Integer::PrimeField(n)
Compiling FriCAS source code from file
/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/3896265268149061013-25px.001.spad
using old system compiler.
PPF abbreviates domain PointedPrimeField
------------------------------------------------------------------------
initializing NRLIB PPF for PointedPrimeField
compiling into NRLIB PPF
compiling exported foo : PositiveInteger -> PrimeField n
Time: 0 SEC.
(time taken in buildFunctor: 4033)
Time: 0.02 SEC.
Cumulative Statistics for Constructor PointedPrimeField
Time: 0.03 seconds
--------------non extending category----------------------
.. PointedPrimeField(#1) of cat
(|Join| (|FiniteFieldCategory|)
(CATEGORY |package|
(SIGNATURE |foo| ((|PrimeField| |#1|) (|PositiveInteger|))))) has no
(|FiniteAlgebraicExtensionField| %) finalizing NRLIB PPF
Processing PointedPrimeField for Browser database:
--->-->PointedPrimeField(constructor): Not documented!!!!
--->-->PointedPrimeField((foo ((PrimeField n) (PositiveInteger)))): Not documented!!!!
--->-->PointedPrimeField(): Missing Description
; compiling file "/var/aw/var/LatexWiki/PPF.NRLIB/PPF.lsp" (written 10 AUG 2025 08:33:51 AM):
; wrote /var/aw/var/LatexWiki/PPF.NRLIB/PPF.fasl
; compilation finished in 0:00:00.012
------------------------------------------------------------------------
PointedPrimeField is now explicitly exposed in frame initial
PointedPrimeField will be automatically loaded when needed from
/var/aw/var/LatexWiki/PPF.NRLIB/PPFAfter compiling, define in the interpreter
g(n,k)==foo(k)$PPF(n)
g(7,4)
Cannot compile a $-expression involving a local variable. FriCAS will attempt to step through and interpret the code.
| (1) |
and it works (in Axiom)! (Do not declare the types for g because n is not defined).
Compiling g is still a problem in Axiom due to signature limitation. At least this way, inlining a complicated function is almost like a function call.
The idea is: Since in creating domains (or any other types of constructors), we are in effect creating a function(the domain constructor PPF is a function of sorts, or functor) and the compiler can take dependent types in its signature,structurally:
PPF(n:PositiveInteger)==PrimeField(n) with foo
so it should be able to compile something like g by lifting it to the package level.
So here is another way using package.
)abbrev package FOO Foo Foo(n:PositiveInteger,k:Integer):with point:()->PrimeField(n) == add point()==k::PrimeField(n)
Compiling FriCAS source code from file
/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/6339949729126981292-25px003.spad
using old system compiler.
FOO abbreviates package Foo
------------------------------------------------------------------------
initializing NRLIB FOO for Foo
compiling into NRLIB FOO
compiling exported point : () -> PrimeField n
Time: 0 SEC.
(time taken in buildFunctor: 0)
Time: 0 SEC.
Cumulative Statistics for Constructor Foo
Time: 0 seconds
finalizing NRLIB FOO
Processing Foo for Browser database:
--->-->Foo(constructor): Not documented!!!!
--->-->Foo((point ((PrimeField n)))): Not documented!!!!
--->-->Foo(): Missing Description
; compiling file "/var/aw/var/LatexWiki/FOO.NRLIB/FOO.lsp" (written 10 AUG 2025 08:33:51 AM):
; wrote /var/aw/var/LatexWiki/FOO.NRLIB/FOO.fasl
; compilation finished in 0:00:00.000
------------------------------------------------------------------------
Foo is now explicitly exposed in frame initial
Foo will be automatically loaded when needed from
/var/aw/var/LatexWiki/FOO.NRLIB/FOOAfter compiling, we can use:
point()$Foo(n,k)
in any computation in compiler code (and in interpreter). In the interpreter you can call this bar(n,k):
bar(n,k) == point()$Foo(n, k)
bar(7,4)
Cannot compile a $-expression involving a local variable. FriCAS will attempt to step through and interpret the code.
| (2) |
Can someone give an example where the signature of bar:
bar: (n: PositiveInteger, k: PositiveInteger) -> PrimeField(n)
is actually needed?
)abbrev package FOO2 Foo2 Foo2(n:PositiveInteger,k:IntegerMod(n)):with point:()->PrimeField(n) == add point()==convert(k)$IntegerMod(n)::PrimeField(n)
Compiling FriCAS source code from file
/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/3511022708306225656-25px005.spad
using old system compiler.
FOO2 abbreviates package Foo2
------------------------------------------------------------------------
initializing NRLIB FOO2 for Foo2
compiling into NRLIB FOO2
compiling exported point : () -> PrimeField n
Time: 0 SEC.
(time taken in buildFunctor: 0)
Time: 0 SEC.
Cumulative Statistics for Constructor Foo2
Time: 0 seconds
finalizing NRLIB FOO2
Processing Foo2 for Browser database:
--->-->Foo2(constructor): Not documented!!!!
--->-->Foo2((point ((PrimeField n)))): Not documented!!!!
--->-->Foo2(): Missing Description
; compiling file "/var/aw/var/LatexWiki/FOO2.NRLIB/FOO2.lsp" (written 10 AUG 2025 08:33:51 AM):
; wrote /var/aw/var/LatexWiki/FOO2.NRLIB/FOO2.fasl
; compilation finished in 0:00:00.004
------------------------------------------------------------------------
Foo2 is now explicitly exposed in frame initial
Foo2 will be automatically loaded when needed from
/var/aw/var/LatexWiki/FOO2.NRLIB/FOO2point()$Foo2(13,2)
| (3) |