define_quotient_type : string -> string * string -> term -> thm * thm
- SYNOPSIS
-
Defines a quotient type based on given equivalence relation.
- DESCRIPTION
-
The call define_quotient_type "qty" ("abs","rep") `R`, where R:A->A->bool
is a binary relation, defines a new ``quotient type'' :qty and two new
functions abs:(A->bool)->qty and rep:qty->(A->bool), and returns the pair
of theorems |- abs(rep a) = a and |- (?x. r = R x) <=> rep(abs r) = r.
Normally, R will be an equivalence relation (reflexive, symmetric and
transitive), in which case the quotient type will be in bijection with the set
of R-equivalence classes.
- FAILURE CONDITIONS
-
Fails if there is already a type qty or if either abs or rep is already
in use as a constant.
- EXAMPLE
-
For some purposes we may want to use ``multisets'' or ``bags''. These are like
sets in that order is irrelevant, but like lists in that multiplicity is
counted. We can define a type of finite multisets as a quotient of lists by the
relation:
# let multisame = new_definition
`multisame l1 l2 <=> !a:A. FILTER (\x. x = a) l1 = FILTER (\x. x = a) l2`;;
as follows:
# let multiset_abs,multiset_rep =
define_quotient_type "multiset" ("multiset_of_list","list_of_multiset")
`multisame:A list -> A list -> bool`;;
val multiset_abs : thm = |- multiset_of_list (list_of_multiset a) = a
val multiset_rep : thm =
|- (?x. r = multisame x) <=> list_of_multiset (multiset_of_list r) = r
For development of this example, see the documentation entries for
lift_function and lift_theorem (in that order). Similarly we could define a
type of finite sets by:
define_quotient_type "finiteset" ("finiteset_of_list","list_of_finiteset")
`\l1 l2. !a:A. MEM a l1 <=> MEM a l2`;;
val it : thm * thm =
(|- finiteset_of_list (list_of_finiteset a) = a,
|- (?x. r = (\l1 l2. !a. MEM a l1 <=> MEM a l2) x) <=>
list_of_finiteset (finiteset_of_list r) = r)
- USES
-
Convenient creation of quotient structures. Using related functions
lift_function and lift_theorem, functions, relations and theorems can be
lifted from the representing type to the type of equivalence classes. As well
as those shown above, characteristic applications are the definition of
rationals as equivalence classes of pairs of integers under
cross-multiplication, or of `directions' as equivalence classes of vectors
under parallelism.
- COMMENTS
-
If R is not an equivalence relation, the basic operation of
define_quotient_type will work equally well, but the usefulness of the new
type will be limited. In particular, lift_function and lift_theorem may not
be usable.
- SEE ALSO
-
lift_function, lift_theorem.