13.2 Definitions¶
The syntax for defining a domain constructor is the same as for any function in FriCAS:
DomainForm : Exports == Implementation
As this definition usually extends over many lines, a where expression is generally used instead. where
DomainForm : Exports == Implementation where optional type declarations Exports == [ Category Assertions] with list of exported operations Implementation == [ Add Domain] add [Rep := Representation] list of function definitions for exported operations
Note: The brackets [ ] here denote optionality.
A complete domain constructor definition for QuadraticForm is shown below. Interestingly, this little domain illustrates all the new concepts you need to learn.
)abbrev domain QFORM QuadraticForm
++ Description:
++ This domain provides modest support for
++ quadratic forms.
QuadraticForm(n, K): Exports == Implementation where
n: PositiveInteger
K: Field
Exports == AbelianGroup with --The exports
quadraticForm: SquareMatrix(n,K) -> $ --export this
++ \\bs{}axiom\\{quadraticForm(m)\\} creates a quadratic
++ quadratic form from a symmetric,
++ square matrix \\bs{}axiom\\{m\\}.
matrix: $ -> SquareMatrix(n,K) -- export matrix
++ \\bs{}axiom\\{matrix(qf)\\} creates a square matrix
++ from the quadratic form \\bs{}axiom\\{qf\\}.
elt: ( $, DirectProduct(n,K)) -> K -- export elt
++ \\bs{}axiom\\{qf(v)\\} evaluates the quadratic form
++ \\bs{}axiom\\{qf\\} on the vector \\bs{}axiom\\{v\\},
++ producing a scalar.
Implementation == SquareMatrix(n,K) add --The exports
Rep := SquareMatrix(n,K) --representation
quadraticForm m == --definition
not symmetric? m => error
"quadraticForm requires a symmetric matrix"
m :: $
matrix q == q :: Rep --definition
elt(q,v) == dot(v, (matrix q * v)) --definition
The QuadraticForm domain.
A domain constructor can take any number and type of parameters. QuadraticForm takes a positive integer n and a field K as arguments. Like a package, a domain has a set of explicit exports and an implementation described by a capsule. Domain constructors are documented in the same way as package constructors.
Domain QuadraticForm(n, K), for a given positive integer n and domain K, explicitly exports three operations:
- quadraticForm(A) creates a quadratic form from a matrix A.
- matrix(q) returns the matrix A used to create the quadratic form q.
- q.v computes the scalar vTAv for a given vector v.
Compared with the corresponding syntax given for the definition of a package, you see that a domain constructor has three optional parts to its definition: Category Assertions, Add Domain, and Representation.