Hacker News new | past | comments | ask | show | jobs | submit login
The metaphysical presuppositions of formal logic (edwardfeser.blogspot.com)
89 points by danielam on July 18, 2021 | hide | past | favorite | 110 comments



> This has some notoriously odd results (known as the “paradoxes of material implication”)

> You’ll still get weird results (known as the “paradoxes of strict implication”)

This is obviously building up to the concept of relevance logic (called "relevant logic" in the UK and Australia) – https://plato.stanford.edu/entries/logic-relevance/ – and no doubt Feser knows about it, but isn't taking the reader there. It seems to me an odd omission.

A lot of his argument is actually against classical logic, not formal logic. Many philosophers and logicians agree that classical formal logic is deeply flawed, and have proposed various non-classical formal logics in response (relevance logic, constructivist/intuitionistic logic, paraconsistent logic, among others). But in this blog post he doesn't interact with or mention any of that work.

> To show that the eternalist conclusion really follows, and does not merely falsely appear to do so, would require independent metaphysical argumentation

I've never understood how Feser manages to believe in both presentism and divine eternity. In my mind they are mutually exclusive propositions. Atheism and process theism / open theism both go well with presentism. But the eternal God of classical theism, who knows all of time as one single moment, seems to me to have an eternalist approach to time as an inevitable consequence.


This article does a great deal to point out the problem, but then just kicks the can down the road.

Yes, metaphysics comes before Logic but metametaphysics comes before metaphysics. Ad infinitum.

All this does is shift the discussion from the laws of logic to the laws of metaphysics - it is turtles all the way down.

There is no way to get off this hamster wheel without a shift of perspective, but computer scientists should feel right at home anywhere recursion arises.

Focus on the laws and the lawmaker. What are laws? Why do we create laws? What do we use laws for? How effective are we at encoding these laws in language?

When we think of laws as designed rather than discovered we become more conscientious in our own inventions.


Which assumes a designer, so now we've compounded the presuppostions. And I don't see how more presuppositions means were more conscientious of them. Or conscious of them, if that was your meaning.


The designer is not assumed.

I am it. I design formal systems.

Formal systems are human inventions. Any expression or description of the “laws of thought” are subject to the limits of self-expression and the expressive power of your formal language. The “laws of thought” are rules of thumb. Useful Heuristics - not universal authorities.

I recommend Luciano Floridi’s recent work in “The Logic of information: Philosophy as conceptual design.”

https://ndpr.nd.edu/reviews/the-logic-of-information-a-theor...


Does the universe have a designer then? It’s a pretty bold metaphysical assumption that the universe is undesigned and purposeless, but it somehow gave rise to an environment where intelligent beings can design formal systems that accurately describe the design of a system with no designer.

This is part of the appeal of the simulationist philosophy, it allows intelligent design, but without the assumptions of monotheism. Naturally like everything else in this space it in turn introduces new difficulties.


None of our formal systems “accurately describe the design”. They all have domains of applicability - operational parameters.

The appeal of the simulation hypothesis is that IF our formalisms could actually explain all of reality THEN it follows by logical implication that reality can be simulated.

This logical implication is true because formal languages are Turing-recognizable. You can “explain” a formalism to a computer. You can program the computer with the Theory of Everything therefore universe can be run on a computer.

This is ALL in the abstract. Unfortunately humans have the propensity to commit the mind-projection fallacy.


This article does a great deal to point out the problem, but then just kicks the can down the road

Isn't this the problem with cynical criticism in general? It's an intellectual dead end, by definition.


Its not turtles all the way down, because there is a preexisting substrate that allows the discussion to happen in the first place.

It is not a presupposition, because to merely state the _possibility_ of it being a presupposition necessitates its existence. There has to be some kind of preexisting substrate that enables thought.

A recursive function can't run without a machine to run it.


You mean like the entity which invents/designs/defines the concepts of "substrate", "possibility","necessity" and "existence" ?

The entity which measures and then captures regularities in "the substrate" in the forms of Mathematical equations (formal languages) - that which we call "laws of physics"? Even though physicists haven't yet solved the measurement problem.

The entity that is trying to understand what it is made of and how it works? The entity that is trying to define itself?

The function is running, alright and it's trying to reverse-engineer its runtime. The question is whether the function is recursive.

Most functions refer to themselves as "I".


Edward Feser doesn’t seem to me to be genuinely interested in challenging his own presuppositions through metaphysics or philosophy, or in communicating the work of others to a wider audience. If the posts that appear on this site are anything to go by, he seems to specialize in a specious species of polemic and obfuscation designed solely to justify and promulgate his political and religious views. If it lends a sense of purpose to his life, makes him a living or gives him a feeling of self-importance/bolsters his worth among his peers, who am I to criticize? Perhaps it is actually a deep satire with some ulterior motive. As an agnostic, one can only hope that a capital punishment for more catholic thinkers is never re-introduced. https://en.m.wikipedia.org/wiki/Edward_Feser


So you’ve just ad-hominemed him in a suspiciously suspect subscribed text. And by sheer coincidence, catholicism. Great.


…catholic with a small ‘c’: https://www.thefreedictionary.com/catholic (…sorry I couldn’t resist the pun…). Personally I think there have been many wondrous, uplifting and glorious achievements of the Catholic church/its followers …and, I’m sure you would agree, some not so much, as is the case with many human institutions… What is it I’m subscribed to? Edward Feser may be a wonderful fellow in person for all I know - I would like to think at least that he is a decent, upstanding, law-abiding, moral etc. citizen - he certainly comes across as erudite and indefatigable in his writing… I just get the feeling that the two blog posts I have read of his that have been posted on this site were both designed solely to reinforce his particular presuppositions? Perhaps I am judging him unfairly - would you recommend something else of his that I should read instead? As I say, if his philosophy/faith works for him, gives him meaning and hope and joy etc. and he genuinely believes in those ideas, I wish him all the best… I worry a little about (perhaps less enlightened) people wanting to apply those ideas to society at large though... You must surely also be aware of examples from history where things have not gone so well? (not least for Catholics at various points in time - incl. ancestors of my own). What do you think?


Your entire comment is an ad-hominem. And a nasty one at that. Frankly, it sounds like you're projecting all these negative things because you hate to see your assumptions challenged.


What do you consider to be my assumptions? As I said in the comment below, I am not attacking the guy personally (that’s what ad hominem means) - I’m sure he may be perfectly lovely and if he is genuine in his pursuits then I genuinely wish him (and you) all the best in life…


> What, pray tell, do you consider to be my assumptions?

I don't know, because you didn't engage with the content of the article at all. You merely casted nasty aspersions on its author.

> I am not attacking the guy personally

Yes, you are.

he seems to specialize in a specious species of polemic and obfuscation designed solely to justify and promulgate his political and religious views. If it lends a sense of purpose to his life, makes him a living or gives him a feeling of self-importance/bolsters his worth among his peers, who am I to criticize? Perhaps it is actually a deep satire with some ulterior motive.

So not only do you throw around unsubstantiated aspersions, but you are also dishonest.


Perhaps you’re right and I was overly harsh or critical of him personally. All I am trying to say, crudely put, is that it seems to me that the author has started from his prior positions and then constructed an argument that reinforces them. That’s fine by me (if he is honest about it), but I hope you can see it is hard to stomach if you don’t agree or can’t see the proof of those prior positions. Specious = “…plausible but false; based on pretense; deceptively pleasing: ‘His incorrect conclusion arose from specious reasoning.’”. For example, a statement like: “…an analysis that simply fails to capture what Aquinas is talking about is hardly rigorous…” (sorry taking that out of context) seems bizarre to me when I consider (the little I know of) the history of philosophical thought since Aquinas… I apologize if I have offended you or the author- that was not my intention - perhaps I am merely showing my ignorance…


You're casting more vague aspersions.

> the author has started from his prior positions and then constructed an argument that reinforces them

There are two ways to interpret this:

1. You're accusing the author of making an argument that is circular. If so, describe the argument, including its premises and conclusion, and specify which premise is the conclusion.

2. You're merely attacking the author for arguing their position. Hardly objectionable and also a red herring, since the soundness of an argument is independent of the author's "prior positions".

Furthermore, I see nothing controversial about the statement you quoted. It is indisputably true, and would be true for any other author.


So is Thomism(/forms of Neo-Thomism) the be-all-and-end-all of philosophical enquiry then? If an argument is based on unexamined prior positions how can it be considered sound? (I suppose there is a problem of infinite regress here/some form of ‘Russell’s teapot’ or something! :) Thomas Aquinas was/is an extremely influential and interesting thinker (especially for his time!), but I find that sadly I don’t necessarily see proof of/share his revelatory faith in the existence of a traditional Catholic God. When I try and boil down various arguments into comment form I cannot definitively argue against those ideas because, for all I know, they may be true, at least on some level... The problem is rather that, as I understand him at least, I see that equally they may not be true and that they derive in part from hefty presuppositions about the existence of god, denial of possible kinds of physical/metaphysical infinite regression (not sure I’m using that term entirely correctly, but what the hey…) /infinite universes/multiverses/even voidist/illusory universes, various other theisms (pantheism, panpsychism or ‘idealism’ for example), atheism and probably a lot more -isms that I can’t think of right now or am just not aware of… If your argument is that philosophy based on formal logic is devalued somehow because it is merely relative/can only express relations between ‘things’ and not ‘things’ in themselves, well, what’s to say that the universe isn’t entirely informationally constituted/‘mathematical’ and therefore able to be defined solely relationally in some form? (not putting that very well - but along the lines of: https://en.m.wikipedia.org/wiki/Our_Mathematical_Universe ). I don’t immediately see how ordinary language is any more potentially categorical than formal logic in such a context - though the power and beauty of words/mathematics is undeniable in a human context, is it not potentially dangerous arrogance to think that we currently/could ever hope to understand God/universal meaning on any definitive, ethically actionable or universally communicable level? Doesn’t the unchallenged adoption of such concretized beliefs invite inevitable abuse and corruption when flawed humans distort them and undesirable actions arise from calcified dogmatism/extremism/literal interpretations? Here’s some Kant, for good measure: “Thinking for one's self is to seek the chief touchstone of truth in one's self (id est, in one's own reason); and the maxim, to think for one's self at all times is Enlightening. Thereto belongs not just so much, as those may imagine who take knowledge, to be enlightening; as it is rather a negative principle in the use of one's cognoscitive faculty, and he, who is very rich in knowledge, is often the least enlightened in the use of it. To exercise one's own reason, means nothing more, than, relatively to every thing which one is to suppose, to question one's self.” — from ‘What it Means to Orient One's Self in Thinking’ ((& Monty Python’s Philosophical Football Match: https://vimeo.com/84600758 )


Why don't you stop soapboxing and address the comment you're replying to?


Ok - please forgive/correct/help me out here if I’ve got the sticky end of the stick, but both the premise and conclusion, very clumsily put, seem to me to be: ‘formal or classical systems of logic are more limited/not as rigorous/less useful/less challenging than some people believe them to be, especially when applied to Aristotelean/Thomist philosophy/conceptions, because of their ‘merely’ relational syntax/nature and because they cannot adequately express/encapsulate concepts/‘things’ that the author holds to be true or self-evident features of his perceived reality/received wisdom/everyday utility/a priori metaphysics. The author concedes its usefulness in certain contexts: particularly when combined/in conjunction with his favoured philosophical ideas, or used in support of them, but that it does not present a challenge/undermine the author’s ideas/beliefs in ways that presumably some prior/present critics might suggest.’


Is it wrong to be opinionated? Feser quickly remarks on a problem of math: some mathematical constructs reflect the system of math more than reality. If your philosophy never touches the political, the reality, aren’t you merely creating a system of reasoning for its own sake?

Moreover, does he need to challenge his own presuppositions? We can do that!


I think that sometimes being overly opinionated and incapable of changing your mind is potentially harmful to others, yes… Is it not potentially dangerous to advocate for various political realities based solely on unexamined/individual opinion-based constructs? Maybe I am wrong, though… I’m curious what you think of the ideas in this article?: https://aphilosopher.drmcl.com/2007/08/26/is-philosophy-just...


I understand caution when stating opinions - it is a good instinct, but I'm not sure what you're arguing.

> I think that sometimes being overly opinionated and incapable of changing your mind is potentially harmful to others, yes… Is it not potentially dangerous to advocate for various political realities based solely on unexamined/individual opinion-based constructs?

How can I disagree with this? Yes there is hazard in advocating for anything. Moreover, there is hazard in doing anything. But I see what you're getting at. There is some line we draw in our own minds between philosophy, that is the pursuit of truth, and political - the realm of opinions.

Where is the line? Most would say that it is when the philosopher argues in good or bad faith. Thus, we are in the realm of the unknowable, the motivations of all around us. Also, not to comment on the notions of whether it's possible for an individual's to be "good" or "bad", but I don't want to digress.

To return, I think you're saying that making statements result in harm to individuals is bad. I agree, but this is a political question, not a philosophical one. Thus providing a philosophical justification or contradiction for your statement is moot.


Is it a good-faith, or bad-faith argument to point out that philosophers (myself included) don't know what they are talking about?

As in literally asking the question: What is Philosophy about?

The only answer we can give is political.


…and yes I think that challenging one’s suppositions ought to be the first task of any aspiring philosopher. Isn’t that the whole idea?


Having read a few philosophers, I don't really see any fundamental difference between Feser's approach and those of other philosophers. All philosophers have their positions and try to construct arguments to support those constructions. Feser's positions are traditional Roman Catholic positions, but your average atheist philosopher (such as Graham Oppy or J. L. Mackie) is doing the same basic thing.

I feel like your expectations for how philosophers ought to behave aren't based on any significant familiarity with the work of actual philosophers, just your suppositions about how philosophy ought to be done.


Good point: perhaps I have an unrealistic, dumb, ill-educated or otherwise malformed ideal/view that philosophers should somehow be constantly challenging their own ideas, using their writing/discourse as an instrument to help them reach better conclusions through statement/contradiction (something like constructing an academic essay using thesis/antithesis/synthesis I guess?) and disputing them internally… Actually, as you suggest, the ‘correct’ approach to philosophy, or at least the only realistically possible approach, is to repeatedly state prior beliefs in the most persuasive way possible and then presumably to defend your a priori views from any challenges by others - only ‘testing’ those ideas in reaction by engaging in external debate rather than an internal one… I wonder though, doesn’t the outcome/process of that debate have to register internally somehow, for one side at least, for it to have any point? …for an evolution of the thinkers involved’s ideas to take place, is it not necessary for one/both sides in a debate to have at least a somewhat open mind, even as they strongly debate their particular ‘side’? …to allow one side to change its mind when the arguments put forward by the opposition are significantly strong - otherwise the debate would inevitably become stale, never-changing and circular? If one side is fixed in its beliefs, why would the other side bother debating them at all? If they were interested in adopting those ideas they should merely ‘receive’ them, rather than engage in an inevitably fruitless debate? I suppose if you have an unshakable belief that there exists an eternal and ever-present truth that you are inalterably sure of, and others who don’t agree with you are simply less enlightened, then you may feel that you should never have cause to change your mind - why should you, as you are already privy to the ultimate truth? Your task then, if you are communicative/evangelical/missionary in some way at least, is only to expound that truth to others? Your writing becomes a vehicle to promote your ‘truth’ - truth informed by mystically or intuitively received wisdom, never conjecture… Your debate/writing etc. is not a way to clarify your own ideas, but rather to show others the folly of contrary thoughts?


But where does it end? Is all reason not based on a set of axioms? You can comment on your presuppositions, if you throw them all out then there is no (classical) logic.

Philosophy is a conversation, and valid argumentation is that starting point of any treatise. The work of contending philosophers is to challenge one another, so there should be no hesitation in using less-than-certain (that is to say, all) presuppositions.

Moreover, Feser does comment on his presuppositions in this very article.

> I would qualify this by saying that metaphysics is prior to logic if “logic” is understood in sense (b) described above, though not if understood in sense (a). Naturally, we have to presuppose certain canons of reasoning when reasoning about anything, including metaphysics. But it doesn’t follow that we have to presuppose the codification enshrined in some particular formal system – such as, for example, modern propositional and predicate logic rather than traditional Aristotelian logic, or rather than some system that tries to capture the best of both worlds (such as that of Fred Sommers).


This seems too vague to me, like a lot of philosophical posts out there.

> For example, if it is true that Aunt May believes that Spider-Man fights crime, then even though Spider-Man = Peter Parker, it does not follow that Aunt May believes that Peter Parker fights crime.

If you can't substitute Peter Parker for Spider-Man, then they are by definition not equal...


Peter Parker = Spider-Man, but "Peter Parker" != "Spider-Man".

It may or may not be true that 12345x54321 = 670592745. (I either put in the correct number there, or changed one digit in the middle at random.)

Let's suppose I didn't change it, and that you haven't yet checked. Then those two things are, really truly, equal -- they are two names for the exact same number -- but you don't know that they are equal. So the _meanings_ of "12345x54321" and "670592745" are not exactly the same, even though if "=" belongs anywhere it belongs between those things.

Philosophers call the thing that's the same the "extension" and the thing that's different the "intension" (not to be confused with "intention" which is an ordinary non-technical word). Sometimes you can safely substitute one thing for another whenever the extensions match -- e.g., when doing algebra. Sometimes you can't -- e.g., when talking about someone's beliefs.

I am not a fan of Edward Feser and I think this article is pretty wrongheaded, but there isn't anything specifically wrong with what he says about Peter Parker and Spider-Man.


My impression of this as a programmer is that if one is modelling a system in which different people may have different beliefs then one must design the model accordingly, otherwise there will be bugs.

But that doesn't mean there's anything wrong with logic itself. Whatever model you come up with is still going to be based on classical logic so at some point you still need to assume that that remains valid in order to do anything at all. And I've never heard of a case where this could fail, at least not within the finite worlds one can in practice model.


I wrote my master's thesis on this exact topic back in 1989. The answer IMHO (which is due to Bertrand Russel [1]) is that the correct rendering of "Aunt May believes that spider man fights crime" is not BELIEVES(AUNT-MAY, FIGHTS-CRIME(SPIDER-MAN)), it is EXISTS(X): BELIEVES(AUNT-MAY, FIGHTS-CRIME(X)) AND BELIEVES(AUNT-MAY, NAME-OF(X, "SPIDER-MAN"))

and then you can also throw in BELIEVES(AUNT-MAY, NOT(NAME-OF(X, "PETER-PARKER"))) if you like.

[1] https://en.wikipedia.org/wiki/Theory_of_descriptions


I think this is wrong, because it can happen that Aunt May believes "Spider-Man fights crime" (she's read lots of newspaper articles saying so) without there being any specific entity that she believes to be Spider-Man.

That is, these two things are different: EXISTS(X): BELIEVES(AUNT-MAY, FIGHTS-CRIME(X)) AND BELIEVES(AUNT-MAY, NAME-OF(X, "SPIDER-MAN")) and BELIEVES(AUNT-MAY, EXISTS(X): FIGHTS-CRIME(X) AND NAME-OF(X, "SPIDER-MAN")), and the second seems to me like a better translation of "Aunt May believes that Spider-Man fights crime", at least for some of the states of affairs you might summarize with that sentence.


You are exactly right. The natural language version is ambiguous. c.f.: "Aunt May believes that Santa Claus fights crime." Philosophers actually argue about things like this, not so much for Santa Claus fighting crime, but whether e.g. "Santa Claus has a beard" is true or false.


In this case, that doesn't matter. What matters is if Aunt May knows or believes that Peter Parker is Spider Man. The equation "Spider-Man = Peter Parker" may be true in the example, but that doesn't mean much. Imagine that we could only think true thoughts...


Spider-Man is a subclass of Peter Parker with a different API and an added "fights_crime" method.

Aunt May has not been given the documentation that explains this, which is probably an intern's fault.

Metaphysically Peter Parker, Spider-Man, Aunt May, and the intern are all mocks anyway. So you can't use them for anything real.

(Except maybe entertainment, distraction, and metacognition.)


Technically no because there is only one instance of Peter Parker or Spider-man that have the same physical boundaries at their time of existence.


I think I'm about to vomit


Indeed, but the issue here is not whether Peter Parker is identical with Spider-Man, but whether two beliefs are the same. The conventional way of looking at it is that talking about what people believe or feel, rather than how the world is (putting aside the complication that this is a fictional character!) creates an "intensional context", in which the substitutability of one name or noun phrase for another is not a given, even if they designate the same thing.

For materialists, it is not difficult to see that the brain of Aunt May believing only "Spider-Man fights crime" would be in a different state than if she also believed "Peter Parker fights crime", as going from the former to the latter would require some physical change.


>If you can't substitute Peter Parker for Spider-Man, then they are by definition not equal...

This is too reductionist.

Can you substitute Peter Parker(before the lab accident) for Spider-Man ?


Nope, and that's why many logical systems are talking about what is at a given time and fail in practice. There are logical systems that take time into account to solve those issues (look at something called referent tracking).


I am aware ;) The question was calculated.

It's obvious that you can't substitute Peter Parker (before the accident) for Spider-man.

The Mathematical idea of equality-as-substitution ignores time. Which is why I called it "reductionist"

https://en.wikipedia.org/wiki/Becoming_(philosophy)


Mathematics have other ways to talk about equivalence than just equality that allow to handle such cases though.


Yeah, but there's an epistemic/cultural issue at play. There's an entire thread below where Mathematicians are aggressively objecting to me demonstrating some of those alternative notions to the point of calling the realizations of my designs "wrong" even though the reification is equivalent to the design.

But in the extreme case you can also construct universes which only speak of inequalities (total order) as a rejection of the identity axiom.

In that universe Peter Parker and Spider Man are different entities, and so what you can and can't say about them is entirely down to judgment.

The most important question is WHY do you want to say anything about anything and who do you want to say it to?

It's difficult to encode any information in language without knowing who is going to be decoding it.


There are different kinds of "equality", beyond the one you are invoking: https://ncatlab.org/nlab/show/equality#DifferentKinds

The most obvious example of A != A being true I can think of is the evaluation of this expression in any programming language:

   Time.now == Time.now


I think you just made an equivocation as those Time.now’s are not the same

  A = Time.now
  A != Time.now
  A == A
Just because Time.now looks like the same symbol it is not as it is an impure function that never returns the same result.


We are not talking about the same computation. What you think I mean is [1]. What I actually mean is [2].

  [1] pry(main)> eval("a != a")
  NameError: undefined local variable or method `a' for main:Object from (pry):1:in `eval'
  [2] pry(main)> eval("Time.now != Time.now")
  => true
I am not assigning the function to a variable - I am lazy-evaluating it.

It's not equivocation because [2] is expressed exactly the same way in English. Now is not now. It is trivially true.

When I use a word, Humpty Dumpty said in rather a scornful tone, it means just what I choose it to mean — neither more nor less


I disagree, because in both programming languages and in natural language, "now" is not a constant: it's a function that returns a different value depending on when it's called.

While the syntax is "now", what you're really saying is now(Ti) for some i.

So the sentence, in both natural language and most programming languages becomes:

    now(T0) != now(T1)
Which is easier to understand, with all arguments made explicit.

Now, some "clever" programming language might automatically translate this from

    now != now
To

    a := now(T0)
    a != a
Which will be surprising to the programmer in most cases (but might be what's desired in others).

The important thing is that "now" is not a comstant, but a function.


Yes! "Now" is not a constant. It's a function. It's a function that takes no arguments. It's also a function that can be lazy-evaluated.

  f() != f()
  A != A
You seem to be agreeing with me but your response to me starts with the English phrase "I disagree".


I disagree, that's the thing: "now" is a function that takes one implicit argument: time.

So "now" is a trickery to hide the fact you're really saying "now(Ti)", for varying i.

I'm not tripping over syntax, but I think you are:

You think you're saying

    A != A
When you're really saying

    A1 != A2
(Or rather

    now(t0) != now(t1)
)

And of course the second form is unsurprising.


You are talking about a different function.

The function I am talking about doesn't take any arguments.

    [1] pry(main)> Time.now(1)
    ArgumentError: wrong number of arguments (given 1, expected 0)


> The function I am talking about doesn't take any arguments.

All impure functions have an implicit dependency on (some subset of) the state of the universe when they execute; in mathematics and logic something with this kind of dependency is typically noted by parameterizing it by time when the actual precise nature of the dependency is outside of the scope of the immediate analysis (because a dependency on the state of the universe at the time of execution is equivalent to a dependency on the time of execution with a hidden function mapping time to state of the universe.)

That impure functions methods are in many programming languages syntactically not distinguished from pure ones does not change the logic here.

That Time.now(at time t0) is distinct from Time.now(at time t1) is... unsurprising, and not an example of A != A in logical terms.


By the way... your conception of a pure function is incoherent.

Parameters ARE inputs. Results ARE outputs. Renaming them to something else is just obscuring the fact that you are still talking about a function with side-effects.

So using Python as my model of computation this is a pure function, but it does nothing:

   def f(): pass
This is NOT a pure function. It has outputs.

   def g(): return True
This is NOT a pure function. It mandates input.

   def h(x): pass
This is NOT a pure function - it mandates input and produces output:

   def j(x): return x
This is a pure function. It calculates the answer to 2+2, but doesn't tell you what it is.

   def k(): 2+2
If pure functions take no input and produce no output, what is there left to analyse? What is Logic and Mathematics talking ABOUT?


Well, it seems our disagreeme is obvious.

You only want to talk about pure functions. I want to talk about ALL functions.

So lets define the function "pure" such that

  pure(f) -> True when f is a pure function
  pure(g) -> False when g is an impure function
What would you say is the truth-value of pure(pure) ?

https://en.wikipedia.org/wiki/Impredicativity


dragonwriter wrote:

> "All impure functions have an implicit dependency on (some subset of) the state of the universe when they execute"

You wrote:

> "You only want to talk about pure functions. I want to talk about ALL functions."

Find the error.


You know what... let me take your red herring away from you. Forget the Time.now function. Here's a !=a as a "pure" function.

   In [1]: class A:
   ...:     def __eq__(self, other):
   ...:         return False
   ...:
   In [2]: a = A()
   In [3]: assert a != a
   In [4]: assert a == a
   AssertionError
Will you now permit me to speak freely about A != A without you moralising about my reasoning?

Will you now recognise my right to free speech and free thought, or must I fall in line?


>Find the error.

Still waiting for you to implement equal() as a "pure" function.

We can discuss what you mean by "error" once we have a referent (that's not just in your head) to talk about.


You know what the state of the universe is when you do logic?

Tell us more! I didn't believe in omniscience until now.

Time.now(t1) and Time.now(t2) is meaningless in this context because t1 and t2 are unbound variables. What are you passing to your function? Where is it coming from?

My function says you are overlooking something.

  [1] pry(main)> Time.now(t1)
  NameError: undefined local variable or method `t1' for main:Object from (pry):1:in `__pry__'
  [2] pry(main)> Time.now(1)
  ArgumentError: wrong number of arguments (given 1, expected 0) from (pry):2:in `now'


If you're familiar with the literature of programming languages, you'll see references to the "world" or the "universe" all the time. That's the kind of universe we mean in this discussion, not the one Carl Sagan talked about.

As for the rest: please provide the implementation of your Time.now function and I'll tell you its implicit parameters. If you're not talking about an actual function that can be run by a computer, then please tell me so and I'll drop it -- I'm not interested in hypothetical functions tautologically defined not to be equal to themselves.


>please provide the implementation of your Time.now function and I'll tell you its implicit parameters.

You are missing the point about extensional and intensional properties of functions.

If you want to look "inside" my Time.now function then maybe you should also look "inside" your equality function and find its implicit parameters?

Here's some Python boiler plate - implement equality and make the assertions pass.

  def f():
    return 1

  def equal(x,y): 
    # Implement equality

  assert not equal(1,2)
  assert equal(1,1)
  assert equal(f, f)

>If you're not talking about an actual function that can be run by a computer

As far as I can tell you are not talking about such a function either when you speak about equality, but I'll reserve judgment until you produce an implementation.

>I'm not interested in hypothetical functions tautologically defined not to be equal to themselves.

OK, but you are interested in hypothetical functions tautologically defined to be equal to themselves.

That's perfectly fine - we are interested in different tautologies.

You want to say equal(f,f) is true.

I want to say not equal(f,f) is true.

We want to say different things.


It doesn't take an explicit argument, but time is definitely an implicit argument of your function; how else do you think the function is implemented?


We are talking about function declaration not implementation, right?

The expression A = A can be trivially re-written in another notation as equal(A,A). The reason you don't question the implementation of the equal() function is because it's declared as being true however it's implemented.

So, I declare f() != f() as being true. I also declare that f() takes no arguments. All I am doing is translating (transpiling?) English into Ruby.

"Now is not now" => "Time.now != Time.now"

Talking about function arguments is not even in point. What's the argument to now() in English?


> All I am doing is translating (transpiling?) English into Ruby.

Incorrectly.

> "Now is not now" => "Time.now != Time.now"

Sure, “Now (pointedly looks at watch) is not now (pointedly looks at watch)” is true, and the equivalent of the Ruby. Ruby expressions lack the implicit simultaneity that English sentences wthout some contextual signal of explicit time dependency have, and your mistranslation ignores this.


Where is the "explicit simultinaity" in looking at your watch twice?

The English and Ruby terms map 1:1.

Now(Time.now) is not(!=) Now (Time.now)

Why do you call the correct "incorrect"?


> Where is the "explicit simultinaity" in looking at your watch twice?

Nowhere; that's the contextual signal that defeats the implicit simultaneity the English sentence would have without that body language.


So you looked at your watch twice at the same time?

The English sentence "Now is not Now" describes my thought process (1st person view), not my body language (3rd person view).

My thought process occurs over time. Exactly like the Ruby process.


These are imperative commands to execute, as apposed to a declarative statement comparing a value to itself.

You can’t switch between symbolic representations to use the meaning of one to make statements about the other because the meaning of the symbols also switch.


So you are telling me that I can't choose to declare that A = A is false?

Telling me what I can and can't do is an imperative statement...


You certainly may define your own symbology.

But if you want to communicate with others you’ll need to agree on your symbology.

In the common mathematical understanding A != A is defined as a false statement. In any example that one can contemplate it would become a true statement then you are replacing one of the ‘A’ symbols with something that is not ‘A’ in your mind.

Which is to say you are using the wrong symbols to represent the idea you intend to communicate.


Indeed I want to communicate with others, but I do not insist on communicating with Mathematicians in particular. I want to communicate with anybody who wants to talk to me about the nature of time. And when we converse about time I want to be able to say the obvious: now is not now. If we get more serious about this time business we might even want to formally express that:

  A != A 
If anybody insist that the above is false then they can exclude themselves from any formal or informal conversation about time on the basis of incomensurability of our paradigms


The above is a false statement because if we say A is "true" then the statement becomes "true != true" which is obviously a false statement. In fact if we put anything in the place of A the results are the same.

If, however, you wish to communicate the evaluation of a function such as "now()", then you would express that as two invocations of that function

now() != now()

or

t != t'

or simply

A != B

So simply using 'A' to mean things not exclusively 'A' is unnecessarily ambiguous. This makes it not only useless for communication between people but also makes it useless for forming any meaningful conclusions.

Failure to be completely expressive about a paradigm is not itself a paradigm. Its just faulty reasoning.


>Failure to be completely expressive about a paradigm is not itself a paradigm. Its just faulty reasoning.

I am being as expressive as my expressivity allows!

   for x in all-entities-in-universe: SOMETIMES(x = x)
Here is an example in Python:

   class A: pass
   class B:
      def __eq__(self, other): return False
   a = A()
   b = B()
   assert (a = a)
   assert not (b = b)
Would you be willing to lead by example and be completely expressive about the paradigm in which fault() is a meaningful function?

Don't moralise about my reasoning, when you are done implementing fault() we can pass my function as an input to yours. That will settle the matter without ceremony.


I am not looking for an a debate; or to be “set straight”.

I am telling you that in my model what I am saying is true . Yes I am talking about function invocation. In Ruby:

  a = lambda { Time.now }
  a.call != a.call
Or…

  x = “Time.now != Time.now”
  eval(x) == true
Not to get bogged down in any particular notation/syntax… I am expressing the same thing in different ways.

  f() != f()
  !( f() == f() )
  A != A
  Now is not now.
If you disagree with this - you are welcome to disengage me.


No need to bring Ruby into this; every language with impure functions (which is almost every language) can reproduce your example.

    f() != f()
And it's not hard to find an f that will satisfy this. This is not surprising or insightful to anyone with programming experience.

Do note two things:

The notation f.call is the same as f(), i.e. function invocation. You're not comparing functions but invoking them and comparing their results.

I don't know the equivalent syntax in Ruby, but in other languages the following is always true:

    f == f
That is, comparing the actual function (something that is constant even if the function is impure) instead of invoking it twice and comparing the results.

Note that the assertion "two things that are not the same might be different" is completely unsurprising. We're just letting syntax confuse us in this discussion.


I am bringing Ruby into the discussion so that I can simply point to an ostensive/empirical example - it spares all of us from the tedious "define it!" game.

It depends on which evaluation strategy you are using. Call by value or call by reference.

   def f
      return Time.now
   end
   f == f
It produces exactly the same effect as the one I am going for. Look past the syntax.


I don't know Ruby. In your example, if you're comparing the function itself, it is true that

   f == f
But it's not true if that's function invocation and there are implicit arguments. Applying a function and comparing its definition are of course different.

The evaluation strategy must come after we agree whether we're comparing values after invocation or definitions. If it's invocations, the evaluation strategy you pick can change the meaning of the program, so that we must discuss semantics.

In all of these cases,

    A == A
Once we make all implicit assumptions explicit.


What does it mean to compare a function to itself without evaluating it?


There are many ways of comparing functions.

A straightforward way can be to simply compare the text of the functions, as written in your programming language of choice, in this case Ruby.

Just take the text of both functions, do a diff, and if it says they are the same, they are the same.

Another comparison could be more abstract, since we know there's more than one way to accomplish the same with a programming language: two functions are the same if, given the same input, they produce the same output. You can either prove this by extension, if the number of possible inputs is finite and small, or you can prove it logically. With some languages which enforce purity using types, you can even show two functions are the same just by looking at their signatures, no need to evaluate anything! (this is one advantage of some statically typed languages, by the way!)

> There are no implicit arguments to the function I have in mind. Passing an argument to the function I have in mind is an error.

Yes, there are implicit arguments. You don't see them because they are implicit! A function that returns the moment in time, "now", of course depends on an implicit argument: the current time! How else is it going to know the moment of "now", otherwise? Think about how such a function is implemented.


>There are many ways of comparing functions.

Indeed. I pointed this out and provided a link in my first post on this thread.

>You don't see them because they are implicit!

The fact that my function takes no arguments is implicit in the specification of my function. I know because I said the English sentence "The function that I have in mind takes no arguments".

You seem to be suggesting that I don't know what function I am thinking about but you do. This is a very peculiar hypothesis.


Your function does take implicit arguments. There's no way your Ruby function can return the current time ("now") without external dependencies that supply that time.

If you want to argue otherwise, you must provide this hypothetical implementation that complies with your specs. I'm telling you that your function effectively can't exist as you describe it. In order for your function to work it requires an implicit argument (the "world" if you want to be coarse, though in this case we know it's the time).

If you want to argue that

    magical function is not magical function
that's fine, but also uninteresting. Magic is not bound by the constraints of the physical universe. We generally don't find arguing about leprechauns and unicorns for this reason (at least, not seriously).


You are asking me to provide the hypothetical implementation for a real-world function?

I don't know how to respond to this. Just observe the thing I am showing you. THAT is what I am talking about. It's right before your eyes - I took it from my head and made it real.

>If you want to argue that

I DON'T want to argue! All I am doing here is expressing myself - you are the one jumping down my throat.

This is me telling you that I am not interested in any social game of figuring out "who is right or who is wrong". If that's the game you are playing - I am happy to terminate the interaction.

What I mean by f() != f() in the abstract is precisely that Ruby program in the concrete. Nothing more - nothing less.

There is no room for "right" and "wrong" here. Those are moral judgments and I've committed no moral violation of any sort.


I'm asking you to provide the actual implementation of your hypothetical function now().

I don't need to know the implementation of the real function Time.now from Ruby because, without looking at its source code, I can tell you that it has implicit arguments.

How can I tell this? Because it's impossible for your Ruby program to tell the time without some kind of interaction with an external source (be it the computer clock, the internet or whatever); this source is your implicit parameter and it's why two invocations of your function don't return the same value. It is impossible for your function not to have this source of time, either implicitly or explicitly.

If you disagree, then please explain how your function tells time.


And I am asking you to provide the actual implementation of your hypothetical function equal().

I don't need to know the implementation of the real function == from any programming language because, without looking at any source code I can tell you that it has implicit arguments: a tautology.

If you disagree, then please explain how equality functions.


I read your point as similiar to u/tgflynn's point about modeling (upthread).

Being a simple bear, so formal logic breaks my head, I agree.

Just a hunch:

These "impedance mismatches" are one root cause for our society's current epistemological crisis. Cases where we can't even agree to a shared base truth.

Further, "now is not now" is a bit like paradox, no? The ability to hold two contradictory thoughts in your head at the same time. A large fraction of people recoil from ambiguity. Also a source of endless strife.


Good example why programming and logic are related, but not the same.


Yes well..

Any two objects are the same, except for their differences. Any two objects are different, except for their similarities.

"Sameness" and "difference" are abstract assertions. So in saying that you are doing programming; or maybe I am doing fuzzy logic.

From my perspective it seems like you are evaluating this expression:

  same?(Logic, Programming) -> False
But a different Oracle machine might produce a different answer :)


It's difficult to engage with the content of the article head-on because it's pretty dense with concepts, but it made me think of two points -

First, when trying to put together a chain of truth-functional syllogisms, if-then logic doesn't really suit the requirements. For propagating boolean truth through the network, digital AND gates are a better fit. If two propositions are false, you really do want the conclusion to be false, not true. If one of the propositions are false, you want the conclusion to be false, regardless of whether the first or second propositions are false. Also, in this case, truth is more an intuitionist concept than a classical concept; where the truth value represents provability - false means "it is false that this conclusion is proven true", not "the semantic meaning of this conclusion is false".

Second, I'm not too familiar with the differences of materialist logic, but it seems that the goal of trying to nail down the semantic meaning of every statement is a goal that will never be met. It seems a more tractable goal to have your machinery reflect the form-validity rather than the content-validity - fully judging the semantic content is something that ultimately is better judged by the people experiencing the content.


Essentialists are map-makers eternally searching for a map that exactly matches the territory, and will forever be disappointed.

Some of the metaphysical problems with logic that the article tries to approach do exist, but in my opinion they are the domain of decision theory, not philosophy.


That's incorrect. Essentialism is more like the claim that there is a territory in the first place.


It's important to sometimes step back and think about whether what you are doing actually makes sense. There are some assumptions about how formal logic is done in ITP (interactive theorem proving) systems that should be challenged. Here is my opinion about that: https://doi.org/10.47757/practal.1


I'm not convinced that it's feasible to design a language that way because features and the underlying system generally seem to influence each other so much, so that I'd suspect starting with 'what you want' has a good chance of making the system unworkable due to breaking something like computationality or making classical logic unsound while making it very hard to notice (if it's not a theoretical property, then something more practical could also be problematic. Something like automation isn't a panacea either because a system needs to be amenable to it). Extending existing systems with something like intersection types seems already hard enough.

As an example, it's very hard for me to judge what it means for equality to not have a type without an underlying system to go along with it. Since it's still featured as part of types (such as your dom f = A ∧ cod f = B example), you still need a typing rule, but what would that look like? It's at the very least non-obvious to me that this doesn't potentially have some issues.

Or, what does extensionality for types cover that isn't done by subtypes? And should this just be a metatheoretic property, or also something that can be stated inside the system?

Besides that, the current items on the list are of course reasonable enough (though nil strikes me as a regression from option types and paraconsistent logic strikes me as totally unusable in the general case as you'd lose A \/ B, ~A |- B, which is absolutely essential.)


You don't need a rule system to understand what equality is.

Yes, it is not computational for sure. It's a logic, not a programming language.

Nil is the way undefinedness is handled in Practal. It is the most elegant way I can think of. You can still have your option type, just as you can have Kleene logic operators, but these are more suitable for doing program verification work in Practal, not so much for doing general mathematics in Practal. You really want (T ∪ Nil) ∪ Nil = T ∪ Nil here, while in programming you usually don't want Option[Option[T]] to be the same as Option[T].

I am not saying it is easy to make all of this work, and to make it work soundly. But less just doesn't cut it.

With a kernel-based approach, you have a chance to get it right. If you find an inconsistency, fix the kernel, and move on. Automation works just on top of it, and doesn't affect soundness. This is the great thing about automation in kernel-based ITP: If it finds some solution or counter-example, great. Otherwise, no harm done.


What you state about subtypes is not really true. HOL Light has subtypes baked into the kernel of the system. See https://github.com/jrh13/hol-light/blob/master/fusion.ml lines 600-637. Coq has sig in the standard library which is not quite it but becomes a lot closer when one assumes proof irrelevance. Also, a COC-based prover can easily be given subsets with a few easy axioms.

Your point that currently it is quite hard to do anything practical in all of the interactive theorem provers is very true, though.


I know the kernel of Hol-Light very well, as I implemented proof terms for it [1]. 600-637 do not define subtypes, but entirely new types. And no, you cannot add subtypes to a COC prover easily.

[1]: https://link.springer.com/chapter/10.1007/11814771_27


HOL Light doesn't have subtyping. If the type system had subtyping, there would be terms that are assigned two different types, where one type is a subtype of the other. So, in a truly subtyped system, you would have it that 3 has both type N and type R, with N being a subtype of R. Instead, in HOL Light, there is a total function from N to R, and a partial function from R to N.

HOL Light allows you to carve out new types of existing types using a predicate filter, and this is baked into the kernel in `fusion.ml`. But this doesn't introduce subtyping relations. Importantly, the kernel rule gives you abstraction and representation functions to move between elements of the new type and the original type, but, unlike in a subtyping system, the terms of the newly defined type are not simultaneously elements of the larger type.


> Instead, coercions are used to emulate some of the advantages of subtyping.

Maybe I missed it in the article, but what does subtyping give you that coercions don't?


Economy of thought.

In my opinion, subtyping declares a "is" relationship, and coercions declare a "can be viewed as" relationship. You would want both in Practal. Subtyping is more tricky than coercions in the sense that if done wrongly, it can introduce inconsistencies, while coercions cannot (they just may fail to be unique).

For example, ℕ should be a subtype of ℝ. Because a natural number IS a real number. Let's say you have the theorem `∀ x : ℝ. P x` for some predicate `P`. With subtyping, also the theorem `P n` holds for any `n : ℕ`. With coercions, only the theorem `P (c n)` holds, where `c : ℕ → ℝ` is the coercion. Now you have an additional constant `c` in your theorem. It makes things more complicated than they have to be. Sure, some pretty printing and nifty automation can help you a lot here, but why would you want to deal with that added coercion tax in the first place for cases where you don't have to?


While I'm not sure it's impossible (though if it's possible I doubt it would be pretty or non-fragile), I've at least never seen anybody emulate generic intersection/union types using coercions. Dependent intersections like in Cedille are definitely impossible.


Very good point.


IMO This article is a mess.

Starts with an interesting premise, the foundations of logic (or rather, what people are taught as the foundations of logic) introduces unspoken assumptions. Then it goes on to illustrate with the worst example I can think off.

  modern physics’ mathematical representations [...] tend to insinuate an eternalist rather than presentist conception of time.
I don't know which modern physicists he talks about, but pretty much any physicist will tell you time has a starting point, and none will make any claims to the existence or non-existence of an ending point. If anything, the lesson from modern physics is to enjoy the (relatively) brief period of time our planet is hospitable to humans.

Then it descends further into an unnecessarily jargon that can only be described as a debate about the sex of angels.


"Eternalism" refers to the static "block universe" conception of spacetime, where all events exist simultaneously, past, present and future. "Presentists", by contrast, hold that the past no longer exists, the future does not yet exist and only the present moment exists. Neither are positions about whether there is/was a first moment of time.

I just finished reading the physicist Sean Carroll's book "From Eternity to Here", which is mostly about the thermodynamic arrow of time and big bang cosmology. He briefly discusses presentism and eternalism, before writing:

"Concerning the debate between eternalism and presentism, a typical physicist would say: 'who cares?'"

To be fair to Feser, I don't think he's commenting on the attitudes of contemporary physicists, but on a particular presentation of physics and logic. I doubt any working physicist cares one jot about this presentation, or formal predicate logic in general. Philosophers may well care, and Feser might just be noticing that his colleagues take formal logic far more seriously than it deserves.


Point taken, did not know about those technicalities, but I would argue that then, the example makes even less sense.

> "Concerning the debate between eternalism and presentism, a typical physicist would say: 'who cares?'"

This is a great illustration that physics doesn’t care one way or another, or more properly, from the point of view of physics the question is meaningless.

Claiming that somehow physics has a biased view in a question it refuses to address altogether is weird.


Very rarely, physists DO care about logic.

For example: https://www.jstor.org/stable/1968621 And: https://en.wikipedia.org/wiki/The_Logic_of_Modern_Physics

But given that the first is from 1936 and the second from 1927, maybe that's out of fashion.


> Very rarely, physists DO care about logic.

Some physicists are interested in quantum logic – that is very much a minority taste within the physics community though. Like interpretations of quantum physics in general, it straddles the boundary between physics and philosophy. (But unlike some more purely philosophical interpretations, it does have some mathematical meat to it.)

https://en.wikipedia.org/wiki/Quantum_logic

https://plato.stanford.edu/entries/qt-quantlog/

https://iep.utm.edu/qu-logic/


> "Concerning the debate between eternalism and presentism, a typical physicist would say: 'who cares?'"

Don't some hypotheses in cosmology effectively presume eternalism? For example, the Hartle-Hawking state aka "no boundary proposal"?


But will a Physicist ever tell you whether time is continuous or discrete?


Once a physicist has experimental proof one way or the other, sure. Until then, they may say "I think..." or "I suspect...", but they won't say "It is..."


Category theory would help them. Yoneda's lemma tells us that elements of collections are uniquely isomorphic to the transformations which create those elements. This explains the butterfly effect where seemingly-unrelated parts of logical statements are causally connected.

This post would have had bite 70 years ago, before we had "formally formal" theories of categories which can subsume any possible set theory. But now the door is closed. Interestingly, the transformations seem to be more important than the elements; whether a logic is e.g. reversible is a property of transformations and not collections.


Isn't that a bit recursive? Don't you use formal logic in creating category theory? Then using category theory to create formal logic is circular.


Sets are 0-categories, so this critique would also suggest that 0-category theories, set theories, are circular too. But we actually place formal logic before sets, and then use sets to reflectively study formal logic without infinite regress.

This is a version of the general pattern that there are no informal justifications for formal reasoning. Once a person tastes formality, then they can judge for themselves whether to adopt it, but there's no self-sustaining proof statement.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: