mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-04 20:17:42 +00:00
38 lines
1.1 KiB
Nim
38 lines
1.1 KiB
Nim
discard """
|
|
action: "compile"
|
|
"""
|
|
|
|
# A vector space over a field F concept.
|
|
type VectorSpace*[F] = concept x, y, type V
|
|
vector_add(x, y) is V
|
|
scalar_mul(x, F) is V
|
|
dimension(V) is Natural
|
|
|
|
# Real numbers (here floats) form a vector space.
|
|
func vector_add*(v: float, w: float): float = v + w
|
|
func scalar_mul*(v: float, s: float): float = v * s
|
|
func dimension*(x: typedesc[float]): Natural = 1
|
|
|
|
# 2-tuples of real numbers form a vector space.
|
|
func vector_add*(v, w: (float, float)): (float, float) =
|
|
(vector_add(v[0], w[0]), vector_add(v[1], w[1]))
|
|
|
|
func scalar_mul*(v: (float, float), s: float): (float, float) =
|
|
(scalar_mul(v[0], s), scalar_mul(v[1], s))
|
|
|
|
func dimension*(x: typedesc[(float, float)]): Natural = 2
|
|
|
|
# Check concept requirements.
|
|
assert float is VectorSpace
|
|
assert (float, float) is VectorSpace
|
|
|
|
# Commutivity axiom for vector spaces over the same field.
|
|
func axiom_commutivity*[F](u, v: VectorSpace[F]): bool =
|
|
vector_add(u, v) == vector_add(v, u)
|
|
|
|
# This is okay.
|
|
assert axiom_commutivity(2.2, 3.3)
|
|
|
|
# This is not.
|
|
assert axiom_commutivity((2.2, 3.3), (4.4, 5.5))
|