Semiquotients #
A data type for semiquotients, which are classically equivalent to
nonempty sets, but are useful for programming; the idea is that
a semiquotient set S represents some (particular but unknown)
element of S. This can be used to model nondeterministic functions,
which return something in a range of values (represented by the
predicate S) but are not completely determined.
A member of Semiquot α is classically a nonempty Set α,
and in the VM is represented by an element of α; the relation
between these is that the VM element is required to be a member
of the set s. The specific element of s that the VM computes
is hidden by a quotient construction, allowing for the representation
of nondeterministic functions.
- mk' :: (
- )
Instances For
Replace s in a Semiquot with a superset.
Equations
- Semiquot.blur' q h = { s := s, val := Trunc.lift (fun (a : ↑q.s) => Trunc.mk { val := ↑a, property := ⋯ }) ⋯ q.val }
Instances For
Replace s in a q : Semiquot α with a union s ∪ q.s
Equations
- Semiquot.blur s q = Semiquot.blur' q ⋯
Instances For
Convert a Semiquot α to a Trunc α.
Equations
- Semiquot.toTrunc q = Trunc.map Subtype.val q.val
Instances For
If f is a constant on q.s, then q.liftOn f is the value of f
at any point of q.
Equations
- Semiquot.liftOn q f h = Trunc.liftOn q.val (fun (x : ↑q.s) => f ↑x) ⋯
Instances For
Apply a function returning a Semiquot to a Semiquot.
Equations
- Semiquot.bind q f = { s := ⋃ a ∈ q.s, (f a).s, val := Trunc.bind q.val fun (a : ↑q.s) => Trunc.map (fun (b : ↑(f ↑a).s) => { val := ↑b, property := ⋯ }) (f ↑a).val }
Instances For
Equations
- Semiquot.instMonadSemiquot = Monad.mk
Equations
- Semiquot.partialOrder = PartialOrder.mk ⋯
Equations
- Semiquot.instSemilatticeSupSemiquot = let __src := Semiquot.partialOrder; SemilatticeSup.mk ⋯ ⋯ ⋯
Assert that a Semiquot contains only one possible value.
Equations
- Semiquot.IsPure q = ∀ a ∈ q, ∀ b ∈ q, a = b
Instances For
Extract the value from an IsPure semiquotient.
Equations
- Semiquot.get q h = Semiquot.liftOn q id h
Instances For
Equations
- Semiquot.instOrderTopSemiquotInstLESemiquot = OrderTop.mk ⋯