79 lines
1.9 KiB
Plaintext
79 lines
1.9 KiB
Plaintext
|
|
// Monoid: a set with an associative binary operation and identity element
|
|||
|
|
//
|
|||
|
|
// This is the simplest algebraic structure with interesting axioms.
|
|||
|
|
// Note: geolog uses postfix function application.
|
|||
|
|
|
|||
|
|
theory Monoid {
|
|||
|
|
M : Sort;
|
|||
|
|
|
|||
|
|
// Binary operation: M × M → M
|
|||
|
|
mul : [x: M, y: M] -> M;
|
|||
|
|
|
|||
|
|
// Identity element: we use a unary function from M to M that
|
|||
|
|
// "picks out" the identity (any x maps to e)
|
|||
|
|
// A cleaner approach would use Unit → M but that needs product support.
|
|||
|
|
id : M -> M;
|
|||
|
|
|
|||
|
|
// Left identity: id(x) * y = y (id(x) is always e)
|
|||
|
|
ax/left_id : forall x : M, y : M.
|
|||
|
|
|- [x: x id, y: y] mul = y;
|
|||
|
|
|
|||
|
|
// Right identity: x * id(y) = x
|
|||
|
|
ax/right_id : forall x : M, y : M.
|
|||
|
|
|- [x: x, y: y id] mul = x;
|
|||
|
|
|
|||
|
|
// Associativity: (x * y) * z = x * (y * z)
|
|||
|
|
ax/assoc : forall x : M, y : M, z : M.
|
|||
|
|
|- [x: [x: x, y: y] mul, y: z] mul = [x: x, y: [x: y, y: z] mul] mul;
|
|||
|
|
|
|||
|
|
// id is constant: id(x) = id(y) for all x, y
|
|||
|
|
ax/id_const : forall x : M, y : M.
|
|||
|
|
|- x id = y id;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Trivial monoid: single element, e * e = e
|
|||
|
|
instance Trivial : Monoid = {
|
|||
|
|
e : M;
|
|||
|
|
|
|||
|
|
// Multiplication table: e * e = e
|
|||
|
|
// Using positional syntax: [a, b] maps to [x: a, y: b]
|
|||
|
|
[e, e] mul = e;
|
|||
|
|
|
|||
|
|
// Identity: e is the identity element
|
|||
|
|
e id = e;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Boolean "And" monoid: {T, F} with T as identity
|
|||
|
|
// T and T = T, T and F = F, F and T = F, F and F = F
|
|||
|
|
instance BoolAnd : Monoid = {
|
|||
|
|
T : M;
|
|||
|
|
F : M;
|
|||
|
|
|
|||
|
|
// Identity: T is the identity element
|
|||
|
|
T id = T;
|
|||
|
|
F id = T;
|
|||
|
|
|
|||
|
|
// Multiplication table for "and":
|
|||
|
|
[x: T, y: T] mul = T;
|
|||
|
|
[x: T, y: F] mul = F;
|
|||
|
|
[x: F, y: T] mul = F;
|
|||
|
|
[x: F, y: F] mul = F;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Boolean "Or" monoid: {T, F} with F as identity
|
|||
|
|
// T or T = T, T or F = T, F or T = T, F or F = F
|
|||
|
|
instance BoolOr : Monoid = {
|
|||
|
|
T : M;
|
|||
|
|
F : M;
|
|||
|
|
|
|||
|
|
// Identity: F is the identity element
|
|||
|
|
T id = F;
|
|||
|
|
F id = F;
|
|||
|
|
|
|||
|
|
// Multiplication table for "or":
|
|||
|
|
[x: T, y: T] mul = T;
|
|||
|
|
[x: T, y: F] mul = T;
|
|||
|
|
[x: F, y: T] mul = T;
|
|||
|
|
[x: F, y: F] mul = F;
|
|||
|
|
}
|