# Divination Methods and Programming Languages

A few years back, I made a post about a theory of divination, where methods of divination can range from the purely intuitive (e.g. clairvoyance) to the purely technical (e.g. meteorological forecasting as seen on the Weather Channel).  Most forms of divination fall somewhere in-between, that combine some aspect of intuition with some aspect of technique or technology (e.g. Tarot, runes, geomancy).  Anyway, in that post, I brought up a few points that I think all people involved in divination should bear in mind, but also a bit about how divination methods are like programming languages.  Being educated as a computer scientist and laboring as a software engineer, I’m prone to using metaphors about the things I’m most knowledgeable in, but I think it can be expanded about how I view divination methods and what they can overall achieve for us.

So, how are methods of divination like programming languages?  Well, what is a programming language?  It’s a system of symbols and a grammar that are used as input to a computer to make it do something.  Punching in numbers and symbols into a calculator, for instance, can be considered a very simple form of programming language: you tell the computer to add these two numbers, divided by this other number, save it to memory, start a new calculation, involve the value stored in memory, and display the output.  Most programming languages (PLs, for short) are much more complicated than this, but the idea is the same: you’re giving the computer a set of instructions that maybe take some input, do something, and maybe give some output.  Computers of any and all kinds exist to interpret some sort of PL, whether it’s just pure binary telling it to turn on or off some set of flashing lights, or whether it’s something elaborate and arcane to simulate intelligence; computers are essentially machines that take in PLs to do other things.  The study of PLs is, in effect, the study of cause and effect: tell the computer to do something, and the computer will do exactly that.  If the computer fails to do the thing, then either the commands given were incorrect (the computer understood them but you didn’t give it the right commands) or invalid (the computer couldn’t understand what you told it to do).

In computer science, there’s a thing called Turing completeness.  If we consider an idealized abstract computer stripped down to its most basic parts (a universal Turing machine), it can compute anything that is, well, computable; by definition, a universal Turing machine can simulate any computable algorithm, any computable programming language, and any computer.  Any computer you see or interact with, including your smartphone or laptop or video game console, is a concrete implementation of a Turing machine.  Turing completeness is a property that applies to computers and, by extension, PLs: if a concrete computer or programming language (let’s call it A) can simulate a universal Turing machine, then because a universal Turing machine can simulate any other type of computation or computation method , then the computer/programming language A can simulate any other computer/programming language.  This is called Turing completeness.

What this boils down to is saying that any Turing-complete programming language can do anything that any other Turing-complete language can do: C is functionally equivalent to ML, which is functionally equivalent to Lua, which is functionally equivalent to lambda calculus.  What this does not say, however, is that any given Turing-complete PL is as easy to use as any other Turing-complete PL.  Thus, what is easy to do in C is problematic in Lisp, which might be outright unwieldy and frightening in some other language.  It may not be impossible, just different; each PL is a different tool, and different tools are good for different ends.  It is totally possible to fix pipe plumbing issues with a hammer, but it’s easier with a wrench; it’s totally possible to just build a house with a wrench, but it’s easier with a hammer.

However, this metaphor of divination methods and PLs can show other things, too.  A geomancy student of mine recently came to me with an interesting question about a detail of a technique that I don’t personally use, but is documented in an old manuscript.  I don’t put any faith in that technique, so I won’t describe it here, but he wanted to know why I didn’t use it, and how we might find out more about it.  He asked me whether I’ve ever asked geomancy about itself before, like to do a reading to confirm or deny certain techniques.  I…honestly can’t see the point of doing so, but to explain why, it’s time to go back to computer science.

In addition to Turing completeness, there’s this other notion in mathematics that applies to computer science and PLs called Gödel’s incompleteness theorems.  It’s a little heady and obtuse, but here’s the gist: say you have some system of describing information, like arithmetic or physics.  This system has a logic that allows certain things to be proved true (“if P, then Q; P, therefore Q”), and can disprove things that are false (“if P, then Q; P, therefore not Q”).  Given any such system, you might want it to be the best possible system that can prove everything that is true while simultaneously disproving anything that is false.  However, there’s an issue with that: you can either have consistency or completeness, but not both.

• Consistency is showing that your logic is always sound; you never end up proving something that is false.  Thus, we can only prove true things.  However, this is too restrictive; if you have perfect consistency, you end up with things that are true that you cannot prove.  Your logic, if consistent, can never be complete.
• Completeness is showing that your logic is always full; you always end up proving everything that is true can be proved true.  The problem with this, however, is that it’s too permissive; sure, everything that is true can be proved true, but there are also things that are false that end up being proved even though they’re contradictions.  Your logic, if complete, can never be consistent.

When it comes to logical systems, of which there are many, we tend to strive for consistency over completeness.  While we’d love a system where everything that could be true is shown as true, we also lose faith in it if we have no means to differentiate the true stuff from the false stuff.  Thus, we sacrifice the totality of completeness in favor of the rigor of consistency.  After all, if such a system were inconsistent, you’d never be sure if 2 + 2 = 4 and 2 + 2 != 3, a computer would work one second or start an AI uprising the next, or whether browsing your favorite porn site would actually give you porn or videocall your mother on Skype.  Instead, with a consistent system, we can rest assured that 2 + 2 can never equal 3, that a computer will behave exactly as told, and that porn websites will only give you porn and not an awkward conversation with your mom.  However, the cost to this is that I have this thing that is true, but it can’t be proven to be true using that system you like.  Unfortunate, but we can make do.

As it turns out, Gödel’s incompleteness theorem applies to any system described in terms of itself; you cannot prove (which is a stronger, logical thing to do than simply giving examples) that a given computer, PL, or system of mathematics is consistent by using that selfsame system.  If you attempt to do so and end up with such a proof, you end up proving a contradiction; thus, your system of logic has an inconsistency within that system of logic.  In order to prove something on the system itself, then, you need something more expressive than that system itself.  For instance, to describe actions, you need sounds; in order to describe sounds, you need language, and in order to describe language, you need thought.  Each of these is less expressive than the next, and while you can describe things of less expressiveness, you cannot describe it in terms of itself.  So, if I have this thing that is true and you can’t prove it to be true using that system you like, then you need something more powerful than that system you like.