I've drawn out my understanding of these below, in the hope that some thoughts that may be helpful. (Fwiw tracking in this level of detail is not yet easy for me! But I think I have made a good attempt.)
I think the basic thing to say is that self-reference is (generally) not a provided primitive! So anything anyone does that looks like self-reference is actually a construction that has to ground out in a finite and fully-unrolled sentence.
Here are my full thoughts though, others will hopefully correct me if anything I'm saying is misleading:
def go[F, R](up: F -> (F -> R), down: (F -> R) -> F) -> R: half: F -> R = lambda f: up(f)(f) return half(down(half))F that's equal to F -> R , you can then pass in the identity function lambda f: f for up and down. Then go will build the resulting "R" by *checks notes* looping forever and never actually returning anything. Anyway.)T=>F=>T=>F... if you set R to something false, so there's no fixed point to be had here.I hope that's helpful!
Hi,
I am trying to more precisely understand some ideas in mathematical logic and find myself drowning a bit in self referential formal logic and theorems by Lob, Tarski, Kripke, Godel...
Looking at Curry's Paradox:
1) Let F be: "if this sentence is true then Santa exists"
2) Assume F is true.
3) Since F says “if F is true then Santa exists” and we have assumed F is true, Santa exists.
4) This proves F implies Santa exists; precisely F. So Santa exists by step 3.
It is obvious to me that the pathology is self reference (roughly the truth value of the sentence is a different kind of thing then the truth value within the sentence) but how would you be more precise?
I'm also interested in being more precise about self reference, godel, strange loops, systems trying to "escape" systems. They too often blend together as concepts in my mind when I think about, e.g., LLMs interpreting their own sparse autoencoders.