The Palsberg work is where one has to be careful about assumptions. They use the word “self-interpreter” in a way that is so general you can even write a self-interpreter for a total language in that language. I don’t find the abuse of terminology helpful. Whatever they are doing, it does not contradict the established facts for the established terminology.

]]>It’s actually a very fruitful tug of war, resulting in more and richer theories and ever deeper results.

]]>I do realize that this in no way invalidates the core of the argument in this post.

]]>Cubical Higher Type Theory as a Programming Language | Existential Type

]]>The following sequence of equations is evidently true

$2 = (\sqrt{2})^2 = \sqrt{2}^{\sqrt{2}\sqrt{2}} = (\sqrt{2}^{\sqrt{2}})^{\sqrt{2}} = a^b$, where

$a=\sqrt{2}$ and $b=\sqrt{2}^{\sqrt{2}}$

The above two relations between natural numbers may be interpreted as

Theorem 1. $\sqrt{2}$ is not rational.

Theorem 2. There are two irrational numbers $a$ and $b$ such that $a^b$ is rational.

If $\sqrt{2}^{\sqrt{2}}$ is rational, let $a=b=\sqrt{2}$.

Conclusion: For these simple examples, the “proofs by contradiction” is the matter of language and its grounding. Simple relations between natural numbers may be expressed in a complex and unclear way in w formal language.

]]>I am a few years late, but you (and others) may find E. Feser’s article “From Aristotle to John Searle and Back Again: Formal Causes, Teleology, and Computation in Nature” relevant and interesting (https://muse.jhu.edu/article/618359/pdf).

]]>Constructivist logician: Assume P is false, from this demonstrate a contradiction follows, hence conclude it is not the case that P is false.

Classical logician: [same as before], and further conclude (by double negation) P is true.

So “proof by contradiction” as classically understood and taught is a technique in two parts where the second part uses double negation and the first uses a technique which I don’t think has a name but I believe should really be called “refutation by contradiction”. It says,

Assume P, from this demonstrate a contradiction follows, hence conclude P is false.

Both constructivist and classical logicians agree this is a reasonable proof technique. In other words, I try something, it fails, I backtrack and fix the part I got wrong. Where they don’t agree, and what is not often appreciated, is that double negation might not hold universally. Without that insight it’s very easily to lump together “refutation by contradiction” and double negation and call the whole thing “proof by contradiction”.

As an aside Euclid Book I, Prop. 6 uses the “refutation by contradiction” plus double negation form whereas Prop. 7 uses the straight “refutation by contradiction” form. This suggests to me the Greek geometers were well aware of the distinction.

]]>Second, mixing radically different notions in single post is a mess. Particularly, mixing “dynamic typing” and “dynamic language” is dangerous noise for average readers.

Third, indeed, the so-called dynamic language do not need to be a (top-level) class. So is true for so-called static languages. There can be languages neither static or dynamic (or, both static and dynamic), when there is lack of explicit phases of translation/execution by design.

Similarly, there can be languages without built-in sorts of any type system (e.g. brainfxxk). (It is your freedom to call things like that “unityped”, but when the methodology does not produce much meaningful knowledge, it’ll be effectively Occam razor’d.) For such cases, the distinction between “static” and “dynamic” may be still effective.

Also note, typing, as a method of discipline in the design of a language, is not always living in the type system of a normative spec, e.g. lvalueness in the C language has property as part of some type system, but it is not part of the type system of C. It can also be missing in the requirements of conformance. For instance, to define the well-defined behavior, C99 methodologically introduced “effective type” reusing the typing rules of expressions (“static typing”), which was exactly the appearance of dynamic typing. But C is still considered a statically typed language since then. Try rewriting the spec, either formally or informally, and evaluate the complexity difference between them, to get the sense. ]]>