Theorem 7.5 (Scott 1981, PRG-19, Β§7) β (πβ β πβ) is effectively given #
Following Dana Scott, Lectures on a Mathematical Theory of Computation, PRG-19, Lecture VII.
Theorem 7.5. If
πβandπβare effectively given, then so is(πβ β πβ). The combinatorsevalandcurryare computable, provided all the domains involved are effectively given. The computable elementsf β |πβ β πβ|are exactly the computable mapsf : πβ β πβ.
This file builds the theorem in green, audited, choice-free milestones (see
HANDOFF.md).
Milestone 1 β Proposition 3.9(i), the consistency condition (forward, #
choice-free)
The keystone is Scott's 3.9(i): a function-space neighbourhood β[Xα΅’,Yα΅’] is
non-empty iff for every
subset I of indices with {Xα΅’ β£ iβI} consistent in πβ, the outputs {Yα΅’ β£ iβI} are consistent
in πβ. We model a subset by a sublist sub β L (this is what the eventual
primitive-recursive
decider enumerates, one entry/bit at a time), and the intersection of a finite
list of neighbourhoods
by interList. The forward direction β non-empty βΉ the subset condition β is
choice-free: given a
witness map f β stepFun L and a common lower neighbourhood Z of the selected
inputs, f relates
Z to the intersection of the selected outputs (a finite inter_right fold over
the explicit
selection, so no undecidable X β Xα΅’ case-split is needed), whence that
intersection is a
neighbourhood by f.rel_cod.
(The reverse direction is genuinely decidable only relative to the presentations β
it needs
πβ-inclusion to be decidable to single out {i β£ X β Xα΅’} β and is developed
with the decider.)
The intersection of the sets in M, taken inside the base set base (so the
empty list gives
base, matching the convention 1.1a where the empty intersection is Ξ).
Equations
- Domain.Neighborhood.interList base [] = base
- Domain.Neighborhood.interList base (Y :: M) = Y β© Domain.Neighborhood.interList base M
Instances For
Milestone 1 β the forward direction of 3.9(i), choice-free. #
A witness map f β stepFun L relates a common lower neighbourhood Z of the
selected inputs
to the intersection of the selected outputs. The selection sub is processed
entry-by-entry with
inter_right, so the proof is choice-free (no inclusion case-split).
Proposition 3.9(i) (Scott 1981, PRG-19), forward direction β choice-free.
If the
function-space neighbourhood stepFun L is non-empty, then for every selection
sub β L whose
inputs admit a common lower neighbourhood Z β πβ, the intersection of the
selected outputs is a
neighbourhood of πβ.
Milestone 2 β the consistency characterization over coded entry-lists. #
A function-space neighbourhood is presented by a list el : List β of entry
codes: each e β el
codes a step pair [X_{e.1}, Y_{e.2}] via Nat.pair. funListOf turns el into
the list of step
pairs, and stepFun (funListOf el) is the neighbourhood β[X_{eα΅’.1}, Y_{eα΅’.2}].
The characterization stepFun_funListOf_nonempty_iff is Scott's 3.9(i): the
neighbourhood is
non-empty iff for every sub-selection sub β el whose inputs have a common
lower neighbourhood
Z β πβ, the intersection of the selected outputs is a neighbourhood of πβ. The
reverse direction
builds the least map leastMap; its consistency hypothesis is discharged
input-by-input by
filtering el with the (choice-free) decidable πβ-inclusion test supplied
by the presentation
Pβ, so it stays β {propext, Quot.sound}.
The step pair coded by an entry e: (X_{e.unpair.1}, Y_{e.unpair.2}).
Equations
- Domain.Neighborhood.funPair Pβ Pβ e = (Pβ.X (Nat.unpair e).1, Pβ.X (Nat.unpair e).2)
Instances For
The list of step pairs coded by an entry-list el.
Equations
- Domain.Neighborhood.funListOf Pβ Pβ el = List.map (Domain.Neighborhood.funPair Pβ Pβ) el
Instances For
Proposition 3.9(i) (Scott 1981, PRG-19), over coded entry-lists β
choice-free. The
function-space neighbourhood β[X_{eα΅’}, Y_{eα΅’}] coded by el is non-empty iff
for every
sub-selection sub β el whose inputs {X_{e} β£ e β sub} admit a common lower
neighbourhood
Z β πβ, the intersection of the selected outputs {Y_{e} β£ e β sub} is a
neighbourhood of πβ.
- (βΉ) is
interList_mem_of_stepFun_nonempty(Milestone 1), pushed throughfunPair. - (<=) builds
leastMap; its consistency hypothesishconsis discharged for each inputX'by filteringelwith the decidableπβ-inclusionX' β X_e(supplied choice-free byPβ), so thatinterYs Ξβ (funListOf el) X'is exactly the intersection of the selected outputs.
Milestone 3a β deciding consistency of a finite index set via the #
inter-chain.
To decide whether a finite list of neighbourhood indices js is consistent in
π (i.e. whether
β{X_j β£ j β js} is a neighbourhood) we fold the presentation's
primitive-recursive inter along
js, starting from masterIdx, to obtain an index idxchain js. The crisp
characterization is:
jsis consistent iffX_{idxchain js} β X_jfor everyj β js.
The point is that X_{idxchain js} is always a neighbourhood (mem_X), so if
it sits inside every
X_j it witnesses consistency; conversely, when consistent, inter's spec (and
the fact that a
subset of a consistent set is consistent) makes the chain compute the genuine
intersection. This
replaces any consistency-flag bookkeeping by a single inter-fold plus a bounded
inclusion check β
all choice-free.
The running intersection of A with the neighbourhoods X_j (j β js),
left-accumulated to
match List.foldl.
Equations
- Domain.Neighborhood.interFrom P A [] = A
- Domain.Neighborhood.interFrom P A (j :: js) = Domain.Neighborhood.interFrom P (A β© P.X j) js
Instances For
A finite running intersection with a neighbourhood inside it is itself a neighbourhood.
The fold of inter along js (starting from a, with X a = A) computes
the running
intersection interFrom A js β provided that intersection is consistent (so
each prefix is too, by
inter_spec).
The inter-chain index of js: inter-fold from masterIdx.
Equations
- Domain.Neighborhood.idxchain P js = List.foldl (fun (acc j : β) => P.inter acc j) P.masterIdx js
Instances For
When js is consistent, the inter-chain index genuinely indexes β{X_j β£ j β js}.
Consistency via the inter-chain (choice-free). A finite index set js
is consistent β
i.e.
β{X_j β£ j β js} is a neighbourhood β exactly when the always-a-neighbourhood
X_{idxchain js} sits
inside every X_j (j β js).
Milestone 3b β bitmask sublist selection. #
The eventual decider enumerates the subsets of an entry-list one bit at a
time: bitSelect L b
keeps the entries of L whose position is set in the binary expansion of b (low
bit = head). Every
sublist arises as some bitSelect L b with b < 2 ^ L.length
(exists_bitSelect_lt), so a
universal statement over sublists is a bounded universal statement over bitmasks
(forall_sublist_iff_forall_bitmask) β and bounded-β of a recursively decidable
predicate is
recursively decidable (RecDecidable.bForall). All choice-free.
The sublist of L selected by the bitmask b (low bit = head).
Equations
- Domain.Neighborhood.bitSelect [] xβ = []
- Domain.Neighborhood.bitSelect (e :: L) xβ = if xβ % 2 = 1 then e :: Domain.Neighborhood.bitSelect L (xβ / 2) else Domain.Neighborhood.bitSelect L (xβ / 2)
Instances For
A universal statement over all sublists of decodeList c is a bounded
universal over bitmasks
b < 2 ^ c (using (decodeList c).length β€ c).
Milestone 3c β the single-pass consistency fold (section ConsFold, #
generic over P).
To decide whether a bitmask-selected sublist of an index list is consistent, we
fold once over the
list threading a state s = pair b (pair idx flag): b the remaining bitmask,
idx an index of the
running intersection β{X_j β£ j selected so far}, and flag β {0,1} recording
whether every
prefix has been consistent. At a selected entry we set idx := P.inter idx (projFn x) and
flag := flag β§ [P.cons_computable says X_idx β© X_{projFn x} is consistent]. The
headline
consUpd_foldl_spec shows the final flag is 1 iff the selected intersection is
a neighbourhood
(using inter_spec to keep X_idx exact along the consistent prefix, and the
fact that the full
intersection being a neighbourhood forces every prefix to be one). All
choice-free.
One fold step (see the section doc). projFn extracts the relevant component
index from an
entry; fc is P.cons_computable's {0,1} consistency tester.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Once the flag is 0, the fold keeps it 0 (inconsistency persists).
Single-pass consistency fold β correctness. Starting from index a (an
index of X a) with
flag 1, the final flag is 1 iff the running intersection of X a with the
selected components is
a neighbourhood. Choice-free.
foldCode-shaped wrapper of consUpd (state lives in w.unpair.2.unpair.1,
entry in
w.unpair.1).
Equations
- Domain.Neighborhood.consStp P projFn fc w = Domain.Neighborhood.consUpd P projFn fc (Nat.unpair (Nat.unpair w).2).1 (Nat.unpair w).1
Instances For
The {0,1} characteristic function of the bitmask-selected-sublist
consistency test, packaged
through foldCode so it is primitive recursive. Input w = pair b c (bitmask
b, list code c).
Equations
- One or more equations did not get rendered due to their size.
Instances For
Consistency of the bitmask-selected sublist is recursively decidable. Choice-free.
Milestone 3d β assembling the function-space consistency decider #
stepFun_funListOf_nonempty_iff (Milestone 2) characterises non-emptiness as a
universal statement
over sublists; forall_sublist_iff_forall_bitmask turns it into a bounded
universal over bitmasks
b < 2^c; antecedent_cons_iff / funConsequent_eq rewrite the per-bitmask
antecedent and
consequent into the interFrom form decided by consFold_decidable. The
implication of two
recursively decidable predicates is recursively decidable (.not/.or/.em,
choice-free), and a
bounded universal of a recursively decidable predicate is recursively decidable
(RecDecidable.bForall).
interList over js.map X is the same set as the interFrom-chain over
js.
The antecedent of Prop 3.9(i) β {X_{e.1} β£ e β sub} admits a common lower
neighbourhood β is
exactly consistency of {e.1 β£ e β sub} in πβ (in interFrom form).
Choice-free.
The consequent of Prop 3.9(i), rewritten from interList to interFrom form.
Proposition 3.9(i) as a bounded bitmask quantifier. The function-space
neighbourhood
coded by
decodeList c is non-empty iff for every bitmask b < 2^c, consistency of the
selected inputs in
πβ forces consistency of the selected outputs in πβ. Choice-free.
The function-space consistency relation is recursively decidable. Given
the binary
consistency deciders fc0/fc1 of the two presentations, (stepFun (funListOf (decodeList c))) is
non-empty is recursively decidable in c. Choice-free.
Milestone 4 β appendCode (list append on entry codes). #
X n β© X m = stepFun (L_n ++ L_m), so the presentation's inter will splice two
entry-lists. We
fold one code onto another (prepending each entry), giving appendCode a b whose
decoded list is
(decodeList b).reverse ++ decodeList a; since stepFun is an intersection
(order- and
duplicate-invariant), this codes X a β© X b regardless of the reversal. All
choice-free.
Prepend the entry x onto the list coded by acc.
Equations
- Domain.Neighborhood.appendStep acc x = Nat.pair x acc + 1
Instances For
foldCode-shaped wrapper of appendStep.
Equations
- Domain.Neighborhood.appendStp w = Domain.Neighborhood.appendStep (Nat.unpair (Nat.unpair w).2).1 (Nat.unpair w).1
Instances For
stepFun (funListOf (decodeList (appendCode a b))) is exactly X a β© X b at
the level of the
underlying step-intersections.
Milestone 5 β the function-space inclusion characterization (choice-free). #
stepFun La β stepFun Lb iff β (X',Y') β Lb, β{Y β£ X' β X, (X,Y)βLa} β Y' (Scott,
via the least map
leastMap/3.9(ii)). The forward direction is choice-free (test the least map).
The backward direction
needs f.rel X' (interYs Ξβ La X') for arbitrary f β stepFun La β the library
rel_interYs proves
this classically (by_cases X' β Xα΅’), so we re-prove it choice-free for the
presented list
funListOf el, replacing the case split by Pβ.incl_computable's recursive
decidability (.em).
Choice-free rel_interYs for a presented list. Any f β stepFun (funListOf el) relates
each
Xβ_{n'} to the intersection of the relevant outputs interYs Ξβ (funListOf el) (Xβ_{n'}). The
case split on Xβ_{n'} β Xβ_{e.1} is discharged by Pβ.incl_computable.em (no
Classical.choice).
If stepFun (funListOf ea) is non-empty, then interYs Ξβ (funListOf ea) X
is a
neighbourhood of
πβ for every X β πβ (the consistency hypothesis needed by leastMap).
Choice-free.
Function-space inclusion characterisation (choice-free). With ea
consistent (so the least
map exists), stepFun (funListOf ea) β stepFun (funListOf eb) iff for every entry
e' β eb, the
intersection of the ea-outputs relevant to the input Xβ_{e'.1} is contained in
Xβ_{e'.2}.
Milestone 5b β the function-space inclusion / equality / consistency #
deciders.
We now turn the choice-free characterization of Milestone 5a into recursive
deciders for the
function-space presentation. Two small generic facts first; then the
interYs-index fold (a
conditional inter-chain over πβ, gated by the decidable πβ-inclusion
test); then the
deciders themselves. All choice-free.
selectFn driven by isOne is a Nat-equality if (choice-free; decEq on
β).
decodeList inverts encodeList: every list is the decoding of its code.
The interYs-index fold: a conditional inter-chain over πβ. #
For a presented list funListOf (decodeList a) and a πβ-index k, the set
interYs Ξβ (funListOf (decodeList a)) (Xβ_k) is the intersection of the outputs
Xβ_{e.2} over the
entries e of decodeList a whose input dominates Xβ_k (Xβ_k β Xβ_{e.1}). We
compute an index of
it by folding Pβ.inter over decodeList a, intersecting at an entry exactly
when the (decidable)
inclusion test fires. condSet k A el is the running set; interYsFoldl_spec is
the index
correctness (when the result is consistent), mirroring interFrom_eq_of_foldl.
The running set of the conditional inter-chain: A intersected with the
outputs Xβ_{e.2} of
the entries e β el whose input dominates Xβ_k.
Equations
- Domain.Neighborhood.condSet Pβ Pβ k A el = {z : Ξ² | z β A β§ β e β el, Pβ.X k β Pβ.X (Nat.unpair e).1 β z β Pβ.X (Nat.unpair e).2}
Instances For
condSet cons-step when the input dominates the head entry's input: intersect
A with the
head's output.
condSet cons-step when the input does not dominate the head entry's input:
drop the head.
condSet k Ξβ el is exactly interYs Ξβ (funListOf el) (Xβ_k).
One step of the interYs-index fold. State pair entry (pair acc k): entry
e = w.unpair.1,
running πβ-index acc = w.unpair.2.unpair.1, input index k = w.unpair.2.unpair.2 (the
foldCode parameter). Intersects acc with e's output index when the inclusion
test fires.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The index of interYs Ξβ (funListOf (decodeList a)) (Xβ_k): a conditional
inter-fold over
decodeList a from masterIdx, with k carried as the foldCode parameter.
Equations
- Domain.Neighborhood.interYsIdx Pβ incl0 a k = Domain.Recursive.foldCode (Domain.Neighborhood.interYsStp Pβ incl0) k Pβ.masterIdx a
Instances For
Correctness of the conditional inter-fold (if-form). When the running set
is consistent, the
fold computes an index of it, by induction with inter_spec (mirrors
interFrom_eq_of_foldl).
interYsIdx indexes interYs Ξβ (funListOf (decodeList a)) (Xβ_k) (when
that is
consistent,
which it is whenever stepFun (funListOf (decodeList a)) is non-empty).
Choice-free.
A concrete {0,1} characteristic function for function-space #
consistency.
funCons_decidable already shows consistency is recursively decidable, but to use
it in data (the
function-space enumeration branches on it) we need a concrete
primitive-recursive char rather than
one extracted from an existential (extraction needs choice). We build it
explicitly from the
component presentations' consistency chars fc0/fc1, and prove its spec via
funCons_iff.
The per-bitmask implication char: consβ(selected inputs) β consβ(selected outputs).
Equations
- One or more equations did not get rendered due to their size.
Instances For
The concrete {0,1} characteristic function of function-space consistency.
Equations
- Domain.Neighborhood.funConsChar Pβ Pβ fc0 fc1 c = Domain.Recursive.bForallFn (Domain.Neighborhood.funImpChar Pβ Pβ fc0 fc1) c (2 ^ c)
Instances For
A {0,1} left-fold AND of isOne β g over a list, started from a β {0,1}.
One step of the stepFun-inclusion fold over decodeList b: test
interYs-index β output.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The {0,1} characteristic function of stepFun (funListOf (decodeList a)) β stepFun (funListOf (decodeList b)) (correct when a is consistent). a is the foldCode
parameter, b the code.
Equations
- Domain.Neighborhood.subChar Pβ incl0 incl1 a b = Domain.Recursive.foldCode (Domain.Neighborhood.subStp Pβ incl0 incl1) a 1 b
Instances For
The trivial test: stepFun (funListOf el) = univ iff every output is Ξβ`. #
The least map of the empty step-list β the function-space bottom: it relates
every πβ
neighbourhood only to Ξβ.
Equations
Instances For
stepFun (funListOf el) is everything iff every output neighbourhood is
Ξβ. Forward:
the bottom map botMap lies in univ, and botMap.rel X Y forces Y = Ξβ.
Backward: [X, Ξβ]
is satisfied by every map. Choice-free.
One step of the trivial-test fold: is this entry's output index equal to
masterIdx?
Equations
- Domain.Neighborhood.trivStp Pβ eq1 w = Domain.Recursive.selectFn (Nat.unpair (Nat.unpair w).2).1 (Domain.Recursive.isOne (eq1 (Nat.pair (Nat.unpair (Nat.unpair w).1).2 Pβ.masterIdx))) 0
Instances For
The {0,1} characteristic function of stepFun (funListOf (decodeList a)) = univ.
Equations
- Domain.Neighborhood.trivialChar Pβ eq1 a = Domain.Recursive.foldCode (Domain.Neighborhood.trivStp Pβ eq1) 0 1 a
Instances For
The function-space enumeration: a code c lists step-pairs; if they are
consistent (gN c = 1,
where gN is the consistency char) the neighbourhood is stepFun (funListOf (decodeList c)),
otherwise we send the junk code to the master neighbourhood univ. Choice-free as
data because the
branch is a Nat-equality if.
Equations
- Domain.Neighborhood.Xenum Pβ Pβ gN c = if gN c = 1 then Domain.Neighborhood.stepFun (Domain.Neighborhood.funListOf Pβ Pβ (Domain.Recursive.decodeList c)) else Set.univ
Instances For
The canonical code of the intersection Xenum n β© Xenum m: appendCode when
both are
consistent, otherwise the consistent side (the other being univ).
Equations
- One or more equations did not get rendered due to their size.
Instances For
interIdx codes the intersection whenever it is non-empty (and the result
is in the
enumeration).
The equality decider eqEnumChar and Scott's relation (i) interEqChar. #
The {0,1} characteristic function of Xenum a = Xenum b. Both consistent β
inclusion both
ways (subChar); one consistent, one junk (univ) β the consistent side is the
trivial
neighbourhood (trivialChar); both junk β equal.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The {0,1} characteristic function of Scott's relation (i) for the function
space:
Xenum n β© Xenum m = Xenum k.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Milestone 6 β assembling the function-space presentation. #
Theorem 7.5 (existence part): (πβ β πβ) is effectively given. We package the
deciders above into a
ComputablePresentation (funSpace Vβ Vβ), with X = Xenum, inter = interIdx
and masterIdx = 0
(the empty step-list, whose neighbourhood is univ = Ξ). The concrete
characteristic functions are
obtained choice-free from the component presentations' relations inside the
Nonempty proof of
funSpace_isEffectivelyGiven (extraction into a Prop goal needs no choice).
Every valid finite step-list is funListOf of some entry-list (choice-free:
Exists.elim of
Pβ.surj/Pβ.surj, entry by entry).
The function-space presentation. Built from explicit characteristic
functions for the
component presentations' relations (gN = function-space consistency,
incl0/incl1 = inclusion,
eq1 = equality), so it is choice-free given those concrete functions.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Theorem 7.5 (existence part) (Scott 1981, PRG-19). If πβ and πβ are
effectively given,
then so is the function space (πβ β πβ). Choice-free.
Milestone 8 β computable elements of (πβ β πβ) are exactly the #
computable maps.
Scott (Theorem 7.5): "The computable elements f β |πβ β πβ| are exactly the
computable maps
f : πβ β πβ." Under the completeness isomorphism toApproxMap (Theorem 3.10),
a filter Ο of the
function space corresponds to the approximable map fΜ = toApproxMap Ο, and
Ο.mem [X, Y] β X fΜ Y.
The enumeration Xenum c of a consistent code is the finite intersection
β[Xβ_{eα΅’}, Xβ_{eα΅’}], so
Ο β Xenum c β β eα΅’, Ο β [Xβ_{eα΅’}, Xβ_{eα΅’}] (the generation lemma
mem_stepFun_iff); junk codes map
to univ, always in Ο. Hence the element index set {c β£ Xenum c β Ο} is r.e.
iff the single-step
relation {β¨n,mβ© β£ [Xββ, Xββ] β Ο} is β the map's neighbourhood relation. The map
βΉ element half is
the choice-free bounded-β over a coded list closure
REPred.forall_mem_decodeList.
Bridge. Ο β Xenum c iff, when c is consistent, Ο contains every
constituent step.
Theorem 7.5 (Scott 1981, PRG-19) β computable elements = computable maps
(choice-free). For
the function-space enumeration Xenum built from a consistency char gN, an
element Ο has an r.e.
index set iff the corresponding approximable map toApproxMap Ο is computable.
Theorem 7.5 (Scott 1981, PRG-19), packaged for funPresentation. An
element of the
function-space presentation is a computable element iff it is (the filter of) a
computable map.
Milestone 7 β eval is computable. #
Scott (Theorem 7.5): "The combinators eval and curry are computable, provided
all the domains
involved are effectively given." The evaluation map eval : (πβ β πβ) Γ πβ β πβ
sends (F, X) to
Y iff every map f β F relates X to Y (Theorem 3.11), i.e. F β [X, Y]
(the step
neighbourhood, viewed as the set of maps relating X to Y). On the product
presentation
prodPresentation funPresentation Pβ, the neighbourhood at index k is
Xenum_{k.1} Γ Xβ_{k.2}, so
(Xenum c, Xββ±Ό) eval Yββ β Xenum c β [Xββ±Ό, Yββ].
The single step [Xββ±Ό, Yββ] is itself a one-entry function-space neighbourhood β
Xenum of the
(always consistent) code β¨β¨j, mβ©, 0β© + 1 β so the relation is exactly the
decidable function-space
inclusion funPresentation.incl_computable, re-indexed by a primitive-recursive
code map. This is
Scott's observation that eval is a recursive set; r.e.-ness (hence
computability) and
choice-freeness follow.
The step neighbourhood [Xββ±Ό, Yββ] as a one-entry Xenum. The code β¨β¨j, mβ©, 0β© + 1
decodes to the singleton entry-list [β¨j, mβ©], which is always consistent (the
step map itself is a
witness), so Xenum of it is stepFun [(Xββ±Ό, Yββ)] = [Xββ±Ό, Yββ].
Evaluation against a product neighbourhood. (F, X) eval Y β F β [X, Y],
for any
function-space neighbourhood F and basic neighbourhoods X, Y: every map in F
relates X to Y
exactly when F is contained in the step set [X, Y] = {f β£ f X Y}.
Theorem 7.5 (Scott 1981, PRG-19) β eval is computable (choice-free).
Relative to the
function-space presentation funPresentation (and the product/codomain
presentations), the
evaluation map eval : (πβ β πβ) Γ πβ β πβ is computable: its neighbourhood
relation is the
recursively decidable function-space inclusion Xenum c β [Xββ±Ό, Yββ], hence
recursively
enumerable.
Milestone 9 β curry is computable. #
Scott (Theorem 7.5): "The combinators eval and curry are computable." For a
map
g : πβ Γ πβ β πβ, curry g : πβ β (πβ β πβ) sends X to the (filter generated
by the) section
map gᴬ = gSection g X, with gᴬ Y Z β X βͺ Y g Z (Theorem 3.12). On the codomain
presentation
funPresentation Pβ Pβ, (Xββ) curry(g) (Xenum c) holds iff the section map lies
in Xenum c, i.e.
(for consistent c) β β¨j, kβ© β decodeList c, Xββ βͺ Xββ±Ό g Xββ β a bounded β
over the coded
list, with the πβ-parameter n of the r.e. relation of g. This is r.e. by
the parameterised
closure REPred.forall_mem_decodeListβ; junk codes go to univ (always
satisfied). Choice-free.
Membership in Xenum for a single map. A map f lies in Xenum c iff
(when c is
consistent) it relates every coded step β¨Xβα΅’, Xββ±Όβ©; junk codes give univ. (The
single-map analogue
of mem_Xenum_iff.)
Bridge for curry. (Xββ) curry(g) (Xenum c) iff, when c is
consistent, g relates
Xββ βͺ Xβ_{e.1} to Xβ_{e.2} for every coded entry e.
Theorem 7.5 (Scott 1981, PRG-19) β curry is computable (choice-free). If
g : πβ Γ πβ β πβ
is computable then so is curry g : πβ β (πβ β πβ): its neighbourhood relation is
the parameterised
bounded β (REPred.forall_mem_decodeListβ) over the r.e. relation of g,
guarded by the decidable
consistency flag.