You're reading the public-facing archive of the Category Theory Zulip server.
To join the server you need an invite. Anybody can get an invite by contacting Matteo Capucci at name dot surname at gmail dot com.
For all things related to this archive refer to the same person.
But go on, you seem to be explaining this stuff.
now, if you have a very simple language—say terms are either numerals or else a term plus another term—then giving semantics is very simple: say the semantics of a term is a natural number; for literals it's the number corresponding to the numeral; for t + u, it's the sum of the semantics for t and the semantics for u
so you can read "(3 + 4) + 5" as having a denotation of 12
you can do something similar for the simply-typed lambda calculus into any cartesian closed category; you may have seen or heard of this
You're talking about the most basic obvious way to give that lambda-calculus a semantics in CCC's, right? Then I know it.
yep!
So far no dcpos...
about to get there :)
so now say we, as mentioned, allow arbitrary recursion
(Just making sure they hadn't slipped by already. Go ahead.)
keep it simple: we take the STLC and add a rec
operator which you use like rec x.e
, with reduction rule rec x.e
↦ e[rec x.e/x]
so a definition like f(z) = ...
which uses f
can be implemented as rec f. λz. ...
the typing rule is
Hold on, this will take me time to absorb.
:thumbs_up:
Where did the f go in that typing rule? Did it turn into , or , or...
You pulled the rug out from under me, notationally. :upside_down:
oops!
there, now x is not being used for 2 things
so i can tell you that the f up there is the x in the rule
Okay, let me see if I can even understand the "informal" explanation
rec x.e ↦ e[rec x.e/x]
that's not informal! it's just operational
it's the reduction rule as opposed to the typing rule
Okay.
it tells you how the thing computes, not how to tell when it's well-formed
It was something I was supposed to understand first.
well, this is all kind of a tangent anyway, so we can drop the typing rule :sweat_smile:
I have no idea what it means except you said the word "recursion" so it's supposed to be about something being recursively defined and plugged into itself.
yeah
I cling to English words...
sorry! let me clarify
i forget that not everyone does PL :sob:
Yes, there's a dwindling band of people who don't.
and has its core concepts/conventions worked into their brain
I can't even remember if e/x means "substitute e into x" or the other way around...
depends on the source :sob: i meant it as substitute e for x
Wow, so people don't even agree! Okay, substitute e into x.
for x—but into the thing preceding the square brackets
Could you read "rec x.e ↦ e[rec x.e/x]" translated into something more like English?
yeah
well, first: read rec x.e
as an "inline recursive definition" much like λ is an "inline function"
Okay, I'll read that except for the word "inline".
so just as you can turn f(x) = e followed by a reference to f, into λx.e
so you can turn x = e, with x mentioned in e, followed by a reference to x, into just rec x.e
Let me do an example.
:thumbs_up:
"do" as in you want to come up with one, or i should give you one?
If x = sqrt(1+x) and I want to refer to the solution of this equation, I say
rec x.sqrt(1+x)
yeah
Okay, I think I got it.
That's cool, but at this rate you may give up on teaching me stuff about dcpos... I hope it's not far from here to there.
we're getting there!
So, probably something like "you can interpret a language with such a recursion operator in a dcpo..."
yup!
if you squint back at the reduction rule i wrote down, you'll see that the operational semantics of the expression you wrote is
rec x.sqrt(1 + x) ↦ sqrt(1 + rec x.sqrt(1 + x)) ↦ sqrt(1 + sqrt(1 + rec x.sqrt(1 + x))) ↦ ...
or rather: it depends on what the operational semantics of sqrt and + and so on are. if they're strict—they force their arguments to be some kind of final result before they make use of them—then you'll get what i just wrote
Right.
but if they start to compute an approximation based on partial info somehow, then you might be able to actually realize some kind of banach fixed point computation of an approximation of a fixed point using this
Aren't you looking as a fixed point in this case?
um, sorry, i can't juggle two ppl at once on this topic daniel :sweat_smile:
(I'm gonna just talk to Sarah right now, since it's working.)
Right.
but anyway, the reduction rule i wrote down above makes good sense as something that produces an ongoing process of computation that hopefully terminates
I was gonna say: that Banach space fixed point stuff and approximations and such involve the metric on R, but I guess the point of dcpos is to sidestep all that.
but in the context of math, where we don't usually view mathematical objects as such things, arbitrary recursion is generally not something you can do in your expression
so if i say rec x.e
, and i interpret e
as some morphism in my CCC, then, well, it's not really clear from here what to do with that morphism to get a denotation for the whole term
tons of morphisms don't have fixed points!
Right. Is rec x.e the same as fix x.e?
yeah
Never mind.
generally you want the denotation of a term to be the same as the denotation of anything it reduces to, or else things are weird
Yes, I get it. So I bet you (or Scott or someone) is going to create a make-believe universe where everything has a fixed point.
yup!
(Some people do use (ultra)metric spaces for this, too.)
but there's good reason for dcpos to model this kind of thing, and for why they're good for fixed points
oh, but re:
generally you want the denotation of a term to be the same as the denotation of anything it reduces to, or else things are weird
since rec x.e
reduces to e[rec x.e/x]
, they should have the same denotation, so that's a fixed point of the denotation of e
Right.
anyway—
the idea is roughly something like:
you enrich your universe to contain undefined or partially-undefined objects
then there is a partial order of "extends the information content of"
so for example, if f, f' : X → Y, and f ≤ f', then whenever f(x) is defined, so is f'(x), among other things
And they're equal I assume...
well, no, it's the pointwise order
Oh, sorry, Y is some sort of ordered set?
but if the codomain is flat, they'd have to be equal
err, sorry, "flat" as in
I thought was some purely "extends the information content of" order.
if you have any set X, the "flat domain" on it is the poset X + 1 which extends X with a unique ⊥ and otherwise everything is incomparable
Okay.
i was perhaps misleading with my phrasing
So all our objects are gonna be posets of some nice sort?
yeah—dcpos with least element, generally
I see, and you can take a mere set and turn it into a poset as you just described, where I guess means 'undefined'.
yup!
And that's a dcpo with least element...
:wink:
so if the codomain is flat, then if f(x) and f'(x) are both "defined" as in non-⊥, they must be equal, yeah
but if the codomain is richer, we only need f(x) ≤ f'(x)
Okay, good.
but that's still "extends info content", because that's what the order on the codomain should mean too!
now:
So like if X and Y are mere sets, and we dcpo-ize them, their internal hom in dcpos will not be the dcpo-ization of a mere set.
nope!
er, i mean: you're correct that it will not be!
That's pronounced "yeah - no!"
:)
I'm just guessing the category of dcpo's you're talking about is cartesian closed because if it weren't who'd ever want to think about it?
iirc it is
Okay, go ahead, though I think I'm getting the idea. I'm still not sure why it's so good to limit ourselves to d cpos instead of those with more general colimits.
however i don't remember the details
i'll circle back around to that in a minute!
anyway: we can view the previously-described "ongoing process of computation" as a gradual enrichment of information content—a sequence of approximations to a final result
so to give this semantics, you collect all of those approximations ahead of time in your platonic math-world, and the denotation is the thing they converge to—the sup
Nice!
Yes, you set it up so that part is obviously the goal.
indeed, the kleene fixed-point theorem states that for a dcpo with least element, every scott-continuous endomorphism f has a least fixed point, which you can compute as the sup of the kleene chain ⊥, f(⊥), f(f(⊥))...
Nice. I know that kind of idea from my studies of large countable ordinals. (Not research, just learning.)
this is the depleted version of the theorem about initial algebras of finitary functors :)
I don't really know the undepleted version, though I should.
So I'm just sorta puzzled that "time" in this story is directed. That makes sense if you can only do one reduction rule at each step in a computation, so there's no branching.
well...
there may be generalizations of this story to other kinds of completeness!
@John Baez said
So I bet you (or Scott or someone) is going to create a make-believe universe where everything has a fixed point.
This is exactly my plan! Is there a problem?
and, i mean, it doesn't mean that exactly, just that they have to come back together later—i.e., church-rosser or something
but yeah, i see what you mean, that might be unfortunate for non-deterministic stuff
but the basic idea is like
Okay, I can believe a lot of people would be content to study situations with confluence.
if the ordering is supposed to be "enrichment of information content"—
then if you have two incomparable things—
what does it mean to take their join?
Is that a rhetorical question?
Some denotational semantics is done with lattices, too.
yeah, but if you have an answer, you could give it :)
I might know x = 2 and you might know y = 3 ; these are incomprable, but someone smarter than both of us might know both x = 2 and y = 3.
i don't think it's a question without an answer, necessarily, but i do think it's a question that requires a delicate answer
oops!
i misspoke
you're right, there's no issue with joins of incomparable things per se
Whew!
i just had a very specific example in mind of things that were incomparable
which should have a problem
namely: things which disagree
if we want to interpret the type nat
as a poset of things ordered by info content, and we have a semantics for the numeral 3
and for the numeral 5
, then what on earth should their join be?
That's a toughie.
8? :stuck_out_tongue:
:thinking:
dcpos for this kind of purpose don't necessarily fail to have all joins which aren't directed, just that there are plenty of non-directed joins they shouldn't be expected to have
Right, I see.
directedness happens to be a good condition for talking about "coherence of approximations"
I see. It's interesting that "incomparability" includes "facts that could never be reconciled" and also just "different partial views that could be reconciled".
i seem to recall @Gershom's talk mentioning something about "lattices with conflict" or some such
i imagine that might be extra structure to distinguish those
In restricting to sups of directed sets you're throwing out the latter ("different partial views that could be reconciled"), seemingly, but I guess somehow they sneak back in.
given that the context was concurrency, where nondeterminism is a big deal, that sounds useful
Maybe something to think about is that DCPO is a relaxation of what someone might come up with first with is ωCPO, where you have sups of ω-chains.
isn't it a strengthening, not a relaxation?
Well, it's a relaxation of what you're required to give to get a sup.
contravariance of swapping between abelard and eloise strikes again!!
but yeah—worth keeping in mind that directed sups w/ finite indexing sets are always just the greatest element of the things youre taking a sup over
Anyhow, we want to be able to do a limit of infinitely many approximations, and directed sets are nicer to work with than ω or something.
so dcpos are really about the infinitary stuff
ha, jinx
I think in general ω might not be 'big' enough.
Some people have bigger computers than others.
Mine always runs for steps before it gives up.
just work in the effective topos
haha, forgetting the var, classic mistake
Yeah - that'd be bad. Anyway, thanks - I think I learned something!
no problem! always happy 2 spread PL knowledge :halo:
I think people could do well teaching "minicourses" like this here... but I really do think it works best one-on-one: if two or more questioners start pulling in different directions I think it's much much harder.
yup :|
So, if I see some dialogue going on here like this I will do my best to stay out of it except for some "yay!" emoticons.
and THAT'S why i don't like giving talks nearly as much as i like chats
not that i've, like, given more than about 2 talks ever, but
I like giving talks because then I'm just talking to an idealized person who knows X and Y but not Z and W: I make up a plausible mental model and stick to it.
And the advantage of this idealized person is that they don't interrupt much.
hmm, i always work best in contexts w/ feedback
But to really convey information well, it kinda has to be one-on-one.
it's why i can focus better on programming than on reading about math, say
probably an adhd thing
I enjoy having the feedback be just me in my own head relentlessly criticizing all the slips where I assume knowledge of Z and W when I'd decided I wouldn't.
That's enough to keep me quite busy in a talk even without annoying real people telling me what they don't understand. :upside_down:
oh sure, but there's no substitute for someone who just actually doesn't know Z and W to catch those :upside_down:
The trouble is that those people also forgot what they knew about X and Y. :upside_down:
hmm.
oh, i was gonna say another thing about directed stuff
it has some relationships with compactness
that's probably mediated by filters i guess
e.g., maybe u know the characterization of compactness that every directed sup of opens producing the whole space must already include the whole space as one of the opens
i posted a thread once on twitter where i twisted this a little further to characterize compactness as a commutation of modalities ^.^
Hmm.
I'm not sure I knew that characterization of compactness, but I can use the axiom of choice to well-order any open cover and then let
to replace it with an increasing sequence of open sets, so yes - it's true.
Or, at least it follows from AC.
well, there's a nicer way—
take the sub-poset of opens in the cover, close it under finite unions, and that's directed
so i guess that's the kind of thing that leads people to want to use directedness instead of, say, ordinal indexing
no choice required!
(for the record, here's the thread i mentioned https://twitter.com/sarah_zrf/status/1229089866551562242)
i saw https://math.stackexchange.com/q/579197 on someone's twitter (i'd quote tweet but can't re-find it) & i like the characterization of compactness & i bet there's a morally similar characterization in terms of some kind of commutation of modalities
- n-sarahzrf where n ≤ (1, 1) (@sarah_zrf)Believe it or not, I'd been confused about what "directed" meant all along today. I don't know why - I know perfectly well what it means. But somehow today I was thinking it meant "linearly ordered".
Now I see this stuff I said was bullshit:
In restricting to sups of directed sets you're throwing out the latter ("different partial views that could be reconciled"), seemingly, but I guess somehow they sneak back in.
"Different partial views that could be reconciled" was intended as a touchy-feely way of saying "incomparable elements in a poset that have some element greater than or equal to both".
But in a directed set all pairs of elements have some element greater than equal to both.
Oh okay, that makes more sense of what you were saying.
no it wasnt bullshit
remember, a dcpo isn't itself directed, it's directed-complete—the index set is what's directed
oops
Oh!
So "directed" refers to "c", not "po".
exactly
Okay, but this makes even more sense. :upside_down:
I don't know if this helps, but as I threw out earlier, the categorical language would be more like a DCPO is like a partial order with filtered colimits (I think).
yeah
Except the 'filtered' is de-categorified.
honestly i don't think it has to be
Yeah, maybe not.
Well, a filtered category that's a poset is exactly the same thing as directed set.
i think if you use a filtered category as an indexing diagram, then the diagram factors thru a directed set
if the codomain is a proset
Yes.
Yes, and I meant "proset" above, not "poset": a filtered category that's a proset is exactly the same thing as directed set.
(I think the good definition of directed set doesn't require it to be a poset, just a proset.)
So now it all makes sense to me. In a dcpo we've got a bunch of "states of partial knowledge about the state of affairs", and if any two of them have the property that there's a state of partial knowledge that extends both, then there's a unique minimal state of partial knowledge extending all of them.
Or in other words: in a DCPO where each element is actually one person's knowledge of the world, and we've got a bunch of people with the property that for all X and X' there's a person Y who knows everything X and X' do, then there's a (hypothetical) person who knows everything this bunch of people do.
Nice!
:)
note the suspiciously similar phrasing to things that involve the word "compact"
like ultraproducts/powers and the compactness theorem
Right!
A "compact" object is one s.t. homming out of it preserves filtered colimits.
i was just tweeting about that :thinking:
Didn't see it!
the description on the nlab page gives an idea characterization that sounds a little like "if you map into a big union then your image lies fully in one of the things being unioned", but
it occurred to me that that only works if the morphisms of the diagram are monic
but like, if you take germs... that's also a filtered colimit, and the morphisms are far from monic usually
and in that case, i worked out that preserving the filtered colimit is sort of like a tube lemma kind of thing o.o
I had my moment of epiphany here:
https://twitter.com/johncarlosbaez/status/1136647587153338368
Compact values of a domain form an important part when you get further into domain theory, too.
E.G. you start considering domains where all values are generated as colimits of compact values (so, the compact values form a 'basis').
However, per one of your earlier comments, my understanding is that the category of these sorts of domains is not Cartesian closed.
(But DCPO is.)
Dan Doel said:
E.G. you start considering domains where all values are generated as colimits of compact values (so, the compact values form a 'basis').
accessible category!
@Jules Hedges hmmmmmmmm, interesting that you just retweeted this from yourself https://twitter.com/_julesh_/status/978928091157364738
do you have something to say 🤨
Yep, yay for converting people to domain theory
have you heard about step-indexing & synthetic guarded domain theory?
Nope
sarahzrf said:
do you have something to say 🤨
Also, I think the most important thing about DCPOs can be summarised like this: the cartesian monoidal structure on the category of DCPOs admits a trace operator
:)
Ah, I do know a tiny bit about the topos of trees, just not the other words you used. Somewhere deep down my todo list is to try to apply it to repeated games
sure, but that doesn't tell you much about what it is about dcpos that makes that true
well, the idea about step-indexing is like
It's true. But I'd really like to see a book on domain theory that uses string diagrams (and I hope I don't have to write it myself, because it sounds like hard work)
so you wanna make a recursive definition, but it's neither inductive nor coinductive, so you can't really make sense of it w/ a typical universal property
er sorry to clarify i mean like it doesn't satisfy the kind of positivity constraint you need—like say you want to solve a fixed point of a functor C^op × C → C
I think domain theory is very much alive, cf. this POPL paper from last year, for instance.
and okay okay i guess that's the kind of thing you often want ends/coends for, but,
the step-indexing approach is like
rather than trying to find a genuine fixed point—define a well-founded sequence of approximations to a fixed point, starting with something undefined and getting better and better
so rather domain-theoretic in flavor
and then you can interpret the recursive definition as defining each approximation in reference to the previous one[s]
then you make your argument parameterized by the index into the sequence of approximations
and show that it works for each of them
and then you need to appeal to some kind of compactness property of your intended ultimate goal to say like
for any given particular case, we only need to know that a finite approximation of the hypothetical fixed point is true
as i understand it, the name "step-indexing" comes from using this for semantics of PLs, and then you do a thing where you're effectively decrementing the index whenever your program takes a step, so that you only have to prove things for runs up to a certain length, or something like that—so the sequence of approximations is indexed by how many steps you can take
now, what's cool about the topos of trees is that it carries structure that lets you make most of what i just described synthetic
when working internally
anyway, i havent really gotten my hands dirty with step-indexing in practice, so beware that any or all of what i just said could be wrong :ghost:
At some point I worked out the intuition, which I never fully checked, that a dcpo can often be thought of as simply "a distributive lattice plus an antichain" -- i.e. it is a distributive lattice with the top cut off. (there may be some finiteness around to make this description work). So this amounts to a set of "atoms" of knowledge, some depending on others, and generally you can freely join them, but at a certain point when two atoms become incompatible, you can no longer obtain their join, and consequently, the join of anything above them.
By the way, it's true in general that {having/preserving} filtered colimits is equivalent to {having/preserving} directed colimits, not just in the situation of looking at colimits in preorders.
oh, really?
Let me find a reference
Direct limits and filtered colimits are strongly equivalent in all categories by Andréka–Németi has a proof.
@Gershom Do you mean with an anti-chain subtracted from it?
So just so everyone notices, Gershom suggested the following:
Conjecture: given a finite dcpo , there is a distributive lattice and an embedding such that consists of all elements of that are less than all elements of some antichain .
yep, john stated my "general feeling" correctly.
Okay.
Nathanael Arkor said:
Direct limits and filtered colimits are strongly equivalent in all categories by Andréka–Németi has a proof.
Nice, maybe this is the original proof. Adamek-Rosicky has a proof, similar but probably shorter, though it is somewhat poorly formulated. They don't cite any reference nor is the paper you linked in the bibliography (though they cite some other papers by the same authors). https://stacks.math.columbia.edu/tag/0032 has what I think is a correct proof.
Actually, I think we may want "strictly less than" rather less than or equal. I.e. the antichain gives the first level of conflicting information, not the last level of allowable information.
Okay, I'll just fix that in my statement in case doesn't read down this far.
hmm, statements involving "strictly less than" always feel wrong to me :\
So what's the lattice look like for a flat dcpo, like the integers?
It can't be 'just add top' because that's not distributive, right?
Is it and the anti-chain is the two-element sets or something?
I guess that works.
All finite posets are DCPOs, as if a finite subset is directed then it has a top element.
Doesn't that mean that this DCPO fails to arise from a lattice in that way, due to the pairs of incomparable elements not having meets? image.png
We do, however, have that every DCPO embeds cofinally into for the opposite of a frame (hence a distributive lattice) and an antichain, assuming choice.
Let consist of the closed subsets of under the Scott topology (i.e. those downwards-closed subsets which are also directed-complete), and consist of the sets for the maximal elements of . Then the inclusion map is injective (as long as we require that was a poset, and not merely preordered), monotone, and cofinal by construction.
(A map between postets is cofinal if every element of the codomain is bounded above by some element of the image. I don't know if that's widespread terminology.)
A map on functions can be given by taking image then downward closure, which makes it functorial, and in fact gives us that the family of embeddings is a natural transformation from Id.
what about DCPOs with least element?
in a finite poset w/ a least element, any two things are gonna have a meet, right?
You can add a least element to the given example
The top two guys have a common lower bound, but not a greatest one
wait, duh lol
The other stuff stays the same if you replace "directed" with "directed or empty", too.
obviously glb stands for least lower bound
the closed subsets of under the Scott topology (i.e. those downwards-closed subsets which are also directed-complete)
hmm, the characterization i know of the scott topology is that the opens are the sets whose characteristic functions are scott-continuous—that's [classically] equivalent to this?
What I think Gershom maybe noticed, and I don't know whether it is true but it seems plausible from a few examples, is that this sort of thing doesn't occur in the DCPOs you get from the denotations of types in Haskell for example.
Another question one could ask is whether computable functions have to preserve meets that exist, or joins that exist.
For some specific notion of "computable" at least.
Reid Barton said:
What I think Gershom maybe noticed, and I don't know whether it is true but it seems plausible from a few examples, is that this sort of thing doesn't occur in the DCPOs you get from the denotations of types in Haskell for example.
i would imagine that's it :upside_down:
For example "parallel OR" with both True || undefined = True
and undefined || True = True
is continuous, and it's computable in a model where you can interleave the computation of the two arguments, but you can't define it in (the pure fragment of) Haskell because in Haskell you have to commit to which argument you want to compute first. (For purposes of modelling in DCPOs, maybe assume the function is curried so it accepts a pair.) Maybe you can detect this difference as failing to preserve meets or joins.
The parallel one doesn't preserve meets, I think.
really? i thought the parallel one existed in dcpos and that was kind of a problem because it meant you didn't get full abstraction
It does exist in DCPOs.
er, wait, actually now i cant remember why that would break full abstraction, maybe i meant definability
So the question is whether there's a smaller (and in particular, non-full) subcategory of DCPOs through which the semantics of Haskell programs also factors.
I don't know what full abstraction is; is it trying to say the maps between semantic objects all arise from actual programs?
I think they must preserve joins because e.g. {(true,⊥), (⊥,true), (true,true)} is directed, and they must be continuous.
full abstraction means that observationally equivalent (i.e., operationally identically behaving) programs get mapped to equal denotations
but like i said, i can't remember now why parallel or would break that, so maybe the property i was remembering was the thing you said
that said, i do remember that the dcpo model of pcf fails to be fully abstract for some reason
I guess that works in general? If you have a and b with a join in a DCPO, then {a,b,a∨b} is directed with sup a∨b, and so it must be preserved by continuous functions.
because it was a major open problem for a long time to provide a fully abstract model without "cheating" by quotienting the syntax or something
okay yeah see the last line here image.png
Dan Doel said:
I guess that works in general? If you have a and b with a join in a DCPO, then {a,b,a∨b} is directed with sup a∨b, and so it must be preserved by continuous functions.
But all you learn is that {f(a), f(b), f(a∨b)} has sup f(a∨b), which you already knew because f is order preserving.
Ah, right. So, it's an upper bound, but it might not be least.
well, it'll be least, it just might not be least for f(a) and f(b) alone
So if parallel or is needed for full abstraction, I guess it must be because it lets you operationally distinguish two terms you otherwise couldn't?
You can write a program that checks whether a function is the parallel-or operator, and then gate behaviour on whether the parallel-or operator has been passed in. Something like t_1 := if is_por { true } else { false}
and t_2 := if is_por { false } else { false}
. You can't distinguish between t_1
and t_2
operationally, because there's no syntax for parallel-or, but you can denotationally.
So really, distinguish denotationally rather than operationally.
Now I'm confused. I thought that there was some fixed mapping from program syntax to denotations. If the denotational semantics fails to be fully abstract for PCF, it means there are two different programs with the same operational behavior but different denotations. If I extend the language by adding parallel or, I don't change the denotations of these programs. Right?
right, but now they no longer have "the same operational behavior"
to be a little more precise, observational equivalence is about distinguishability by the rest of the language
Yes, because now there's some context (presumably involving parallel or) which distinguishes them
OK, I see that t_1
and t_2
would be an example if I knew how to implement is_por
.
More specifically, is_por
needs to send parallel or to True and anything definable without parallel or to False or undefined
acts similarly to t_i
here, with is_por
inlined.
OK, right. For some reason I thought it would have to be more complicated.
So informally, we could say that PCF has the ability to specify a function it cannot define
Yes, and that in the semantics it can be.
But another way to fix this could be to adjust the denotational semantics to make the denotations of these programs equal, say by restricting the morphisms to ones which preserve meets.
It seems obvious enough that it should have been tried already.
So, probably there is a reason that it doesn't work...
For example maybe it's not actually true that functions definable in PCF preserve meets.
Let me answer @Jem with how it works in the case given, which is not a counterexample. You have a distributive lattice and an antichain, and what you want is every element not greater than or equal to the antichain (which is a bit different than what john wrote above) to be your DCPO.
That's the bruns-lakser embedding of the non-lattice X (which maybe should be called the "confused poset") into a distributive lattice (omitting bottom). again, just the downsets of the join-irreducibles (which in this case is true of all elements). Now we can recover X by taking everything not >= the element "ab". So X is the distributive envelope of X minus the "conflicted" information when both a and b occur. We can read it as "you can get to c from a, and you can get to c from b, but you can't have a and b at once." and similarly for "d".
With the converse statement, we can instead of course take everything that is >= ca or db -- i.e. instead of picking out the minimal conflicted elements we pick out the maximal consistent elements.
Even if you define distributive lattice to only require binary meets/joins, don't you still need to explicitly exclude the bottom element of the lattice, as well as elements which are at least the antichain? The pictured poset doesn't have a meet for ca and db.
I don't understand how this is an embedding; what happened to the edge ?
yeah, i think your diagram is a bit mangled
Damnit, let me redraw the diagram.
yep its a real counterexample, and what i sketched is wrong. here's the right embedding (which coincides with dedekind macneillie in this case) and you can't "cut out" the bits you need with just an antichain.
IMG_3761.jpg
Indeed the argument is simple enough -- since every finite poset is a dcpo then obviously not every finite poset is given by a distributive completion and an antichain. I wonder if I was thinking of something else I read, or just totally off base.
In this case the interesting bit is "you can't have a and b together, unless they are "resolved" by either c or d. so things that are not compatible can be made compatible in multiple ways.
Hrmm.. does what I sketched work for algebraic domains -- aka those where every element is the supremum of compact elements below it?
Isn't this example an algebraic domain?
I was trying to figure out if something like that ruled out this example, but it seems like it doesn't.
Isn't every finite poset an algebraic domain, because any directed subset has a top element, hence the join of a directed subset is in the directed subset?
I think so. Every element of a finite poset is compact, so the whole poset is a compact basis for itself. Or something like that.
ok now i'm more confused than ever. if the definition of "algebraic domain" is "every element is the supremum of compact elements below it", then in the original diagram, the compact elements below "c" are "a" and "b" and they don't have a supremum in X, right? or am i misunderstanding the definition?
It's the elements 'way below' it. But compact elements are 'way below' themselves.
The fact that it's written << doesn't help, though.
whoaa i think the compactness theorem of FOL says that the proset of theories ordered by reverse semantic consequence—i.e., T ≤ T' iff T' ⊨ T—has a compact top element
er, i mean, you have to do a little bit of work to establish the equivalence, but i think they're roughly equivalent statements
Oh that's cute! Which version of FO compactness do you have in mind ? "If , then there is a finitely generated s.t. " ? (it seems a bit sad to me to restrict to deriving )
well, given that i phrased using ⊨, we'd have T ⊨ ⊥ instead, which is equivalent to not having a model
without need for completeness
er, to be clear, i'm understanding T ⊨ T' here to mean Mod(T) ⊆ Mod(T')
so completeness is T ⊨ φ <-> T ⊢ φ
Yes sorry, I am used to converting to the variant in terms of , and why that's called compactness is maybe less immediate from a formal pov :) For (classical/intuitionistic) FOL, I like to do away with models (so that I don't have to think about what notion my interlocutor is thinking of (Tarskian, Kripke, ...)) when I can and think of the statement proven directly "by induction over a proof-tree".
yeah, me too ;)
By the way, what I think I may have been thinking of is not DCPOs but the much more specialized gadgets of prime algebraic domains (since those come up in the event structure stuff i was looking at) https://www.cl.cam.ac.uk/~gw104/REPN-updated.pdf -- but again, given my track record here, who knows.
sarahzrf said:
it's why i can focus better on programming than on reading about math, say
Yes, I think it's an ADD thing (I don't have the H). The computer keeps interacting with you, telling you interesting ways in which your code isn't right yet. It's a two-way conversation, not a monologue. Like a very abstract video game, one that interacts without pictures or natural language.
i like to joke that coq is the world's greatest puzzle game
i don't know that i specifically "have the H" either—i want to say that at some point they stopped bothering to keep track of the difference? i'm not sure though.
(i guess it also depends on who "they" is)
It's no joke. I like to learn languages by reading other folks' code. Every time I find a Coq file or library to study, I invariably run into a construct I've never seen before. So I look in the reference manual, the imported libraries, maybe I find it and in trying to understanding that construct, encounter 3-4 more I've never seen before. And so on. It's a massive, distributed puzzle..
so i think explaining stuff in this topic is where it really clicked for me that like... operational semantics of PLs are basically describing how programs give rise to processes, and then a ton of the time, difficulties in finding denotational semantics stem basically from trying to cram process-nature into the math world
and every time i explain something related, it just gets more and more cemented in my head
i really like this pov
i think it explains very well why brouwerian math applies so often
and but so
i stumbled on that one ncat cafe post again where @John Baez was bemoaning the apparent destruction of "computation" itself in quotienting together conversion classes of terms to form a CCC out of the simply-typed lambda calc
& how reduction ought to be higher cells, etc, which ties in with some work these days on higher dimensional rewriting i think??
so now i have some vague stuff buzzing around in my head like...
i wonder if @Jonathan Sterling has any input on this
Be careful what you wish for! :)
The idea of reductions as higher cells instead of equations can play an important role in the study of computation; this approach, for instance, can be used in combination with homological tools to compute invariants of rewriting presentations of algebraic theories --- for instance, placing bounds on the number of axioms needed to present a given theory.
It is currently unclear whether, or to what degree, the higher dimensional perspective will benefit programming languages. I am optimistic, but I think that "every reduction is a higher cell" is going to be definitely too naive --- because some reductions are more "important" than others. Many reductions in programming languages are not interesting and are mere technical details, whereas some reductions are extremely important --- even so important that the "models" we use to study programming languages rarely validate these reductions. These reductions are called, in the field, "fold-unfold" reductions and have to do with recursive types and fixed points. A reasonable hypothesis is that _all other_ reductions should be treated as exact equations, but these fold-unfold reductions should be thought of in a different (perhaps higher dimensional) way --- but it is still super unclear how all this will shake out.
Some people like to say that even alpha renaming of variables is a "reduction" that should be a higher cell... My opinion is that this perspective is irrational, because the existence of alpha renaming is a consequence of a given formal encoding of a language and doesn't reflect any decisive aspects of the language. Therefore, I think the most important thing will be to study the input of higher dimensional ideas on programming languages in a way that is very conscious of the open problems in the discipline, and in a way that can be explained to experts in the discipline (who usually know very little, if any, mathematics). This seems to be necessary in order to tell apart the "cool but useless" and the "cool but decisive" ways to apply higher dimensional ideas to programming languages.
hmm, that's interesting, but i'm not sure how much it bears on the particular POV i meant to ask about :thinking:
or, well, let me rephrase: why would you say that "A reasonable hypothesis is that _all other_ reductions should be treated as exact equations"?
Here's an argument: this is essentially the precedent set by intensional type theory. α, β and some η rules are exact and just happen automatically, because they are decidable, and that is convenient. The higher dimensional structure ('propositional equality') is there for things like undecidable reductions that you must prove by induction. When you move into homotopy/cubical stuff, the higher stuff gives computational evidence of other 'equations' that are hard/impossible to decide.
And if you want to change the precedent, what is gained by making people manually specify that 'x = y' by some β reduction, say? You might want higher-dimensional (directed) structure in your language because it's nice for modelling operational semantics of a language you're describing within it. But what is the benefit of making people write down the steps in the operational semantics of the meta language to prove an equation between terms, when the computer could figure it out?
i don't think i suggested any such thing :mischievous:
for one thing, i'm not talking about when you work internally to a system—i'm talking about when you give denotational semantics to an object language
Okay, so there was no reason for bringing up the CCC thing?
er, sorry, i meant i don't think i suggested any such thing as "making people write down" etc
Anyhow, I was trying to answer what I thought the thing you quoted meant.
Perhaps that confirms that it wasn't what you were talking about, unless Jon meant something else.
For cases where you want to explicitly reason about operation, higher dimentional stuff also seems useful (and John Baez has a cool paper on it). I'm not sure I'd call it "denotational semantics" just because it's math, though.
but it's denotation :thinking:
https://arxiv.org/abs/1905.05636 There's the Baez paper, if you haven't seen it.
So I guess an alternate question is: if you describe the stuff in an operational semantics as forming a higher dimensional category, why does it become 'denotational semantics'?
sarahzrf said:
or, well, let me rephrase: why would you say that "A reasonable hypothesis is that _all other_ reductions should be treated as exact equations"?
The reason I think this is a reasonable hypothesis is that we have found no interesting theorems about programming languages that hinge on the other equations holding only weakly, whereas much of modern PL hinges precisely on the fold-unfold equation being weak. It may of course turn out that it is best for everything to be weak, but at a time when we are so ignorant of the _conceptual_ aspects of PL, I find it safest to base my hypothesis on the data I currently have.
I should weaken or qualify my last remark --- there is plenty of interesting stuff to be said about a situation where everything is weak, and I think it's super cool. I just want to say that the last decade or two of PL research seems to point to this one class of non-equation being very important, and probably fundamental to whatever it is PL is studying.
Regarding "operational semantics" vs "denotational semantics", I feel this distinction is very old-fashioned (but unfortunately still current). It comes from a time when classical denotational semantics (like domain theory) had started to be recognized as suffering from severe limitations and obscurity, and a generation of PL researchers abandoned it and adopted what they started to call "operational semantics". With operational semantics, many amazing theorems about programming languages became possible to prove, but what was lost was the ethos of compositionality --- an entire generation of researchers basically abandoned the very notion of compositionality, with good intentions, but of course, suffering a loss of perspective as a result (IMO).
What is denotational semantics? It is just semantics period, and the word "denotational" is (in my opinion) quite redundant. The need to distinguish from operational semantics comes from the fact that most operational semantics is really operational non-semantics (to rip off the joke of Kontsevich). When operational semantics is made compositional (as in game semantics, as well as these cool higher dimensional things), then it is "denotational" in some sense, but I would just say that it has been turned into semantics, period.
Now, coming back to "non-semantics", it is not for nothing that practitioners have been doing "non-semantics" for so many years --- specifically, the old dogma that these fold-unfold situations (and other similar things) should be strict equations has made the semantics of such theories very awkward, and I think now that we are recognizing that these equations should be re-thought, we can also re-think the operational aspects of programming languages from an objective/semantical point of view.
sarahzrf said:
i stumbled on that one ncat cafe post again where John Baez was bemoaning the apparent destruction of "computation" itself in quotienting together conversion classes of terms to form a CCC out of the simply-typed lambda calc
This was the same concern I had with the Backprop as Functor paper, that they were quotienting out stuff just to get a SMC of "learners". As Jonathan Sterling pointed out with his history of semantics:
it is not for nothing that practitioners have been doing "non-semantics" for so many years --- specifically, the old dogma that these fold-unfold situations (and other similar things) should be strict equations has made the semantics of such theories very awkward [...]
I just hope that we've now learned enough not to head down the same path with ML.
Dan Doel said:
https://arxiv.org/abs/1905.05636 There's the Baez paper, if you haven't seen it.
The Baez-Williams paper. This looks like it could be part of Christian's thesis.
Jonathan Sterling said:
The need to distinguish from operational semantics comes from the fact that most operational semantics is really operational non-semantics (to rip off the joke of Kontsevich).
I'm curious: what was the original joke of Kontsevich?
Rongmin Lu said:
Dan Doel said:
https://arxiv.org/abs/1905.05636 There's the Baez paper, if you haven't seen it.
The Baez-Williams paper. This looks like Christian's work.
We actually both worked on it!
John Baez said:
Rongmin Lu said:
Dan Doel said:
https://arxiv.org/abs/1905.05636 There's the Baez paper, if you haven't seen it.
The Baez-Williams paper. This looks like Christian's work.
We actually both worked on it!
Clearly! I just wanted to point out it's not "the Baez paper", but something that looked like it could be part of Christian's thesis. I should've kept the original wording, the edit made it worse! Sorry, John! :sweat_smile:
I was just joking around. It's not a "Baez paper", nor is it "Christian's work" - we both put a lot of ourselves into it, and we were fleshing out and polishing some ideas of Mike Stay and Greg Meredith.
Christian has been working a lot with them.
John Baez said:
It's not a "Baez paper", nor is it "Christian's work" - we both put a lot of ourselves into it, and we were fleshing out and polishing some ideas of Mike Stay and Greg Meredith.
Well, that's complicated... :thinking: :sweat_smile:
But complicated is awesome. Good to know how those ideas have been shepherded.
Rongmin Lu said:
Jonathan Sterling said:
The need to distinguish from operational semantics comes from the fact that most operational semantics is really operational non-semantics (to rip off the joke of Kontsevich).
I'm curious: what was the original joke of Kontsevich?
I am hearing it third-hand but the joke was that "non-commutative geometry" is really "non-commutative non-geometry" --- because important aspects of geometrical language do not extend to noncommutative rings. But I don't know enough to say whether the joke was funny in its original context ;-)
Jonathan Sterling said:
Rongmin Lu said:
I'm curious: what was the original joke of Kontsevich?
I am hearing it third-hand but the joke was that "non-commutative geometry" is really "non-commutative non-geometry" --- because important aspects of geometrical language do not extend to noncommutative rings. But I don't know enough to say whether the joke was funny in its original context ;-)
Lieven le Bruyn wrote in 2006 that Kontsevich had apparently mentioned "non-geometry" in a talk in Antwerp "a couple of years ago". I think I've also heard references to "point-less geometry" as well, but probably not from the same source.