Most active commenters

    ←back to thread

    Learn Prolog Now

    (lpn.swi-prolog.org)
    205 points rramadass | 20 comments | | HN request time: 0.001s | source | bottom
    Show context
    disambiguation ◴[] No.45902807[source]
    I am once again shilling the idea that someone should find a way to glue Prolog and LLMs together for better reasoning agents.

    https://news.ycombinator.com/context?id=43948657

    Thesis:

    1. LLMs are bad at counting the number of r's in strawberry.

    2. LLMs are good at writing code that counts letters in a string.

    3. LLMs are bad at solving reasoning problems.

    4. Prolog is good at solving reasoning problems.

    5. ???

    6. LLMs are good at writing prolog that solves reasoning problems.

    Common replies:

    1. The bitter lesson.

    2. There are better solvers, ex. Z3.

    3. Someone smart must have already tried and ruled it out.

    Successful experiments:

    1. https://quantumprolog.sgml.net/llm-demo/part1.html

    replies(13): >>45903080 #>>45903178 #>>45903192 #>>45903204 #>>45903228 #>>45903263 #>>45903361 #>>45903376 #>>45903458 #>>45903841 #>>45904155 #>>45904166 #>>45904490 #
    1. jodrellblank ◴[] No.45903192[source]
    > "4. Prolog is good at solving reasoning problems."

    Plain Prolog's way of solving reasoning problems is effectively:

        for person in [martha, brian, sarah, tyrone]:
          if timmy.parent == person:
            print "solved!"
    
    You hard code some options, write a logical condition with placeholders, and Prolog brute-forces every option in every placeholder. It doesn't do reasoning.

    Arguably it lets a human express reasoning problems better than other languages by letting you write high level code in a declarative way, instead of allocating memory and choosing data types and initializing linked lists and so on, so you can focus on the reasoning, but that is no benefit to an LLM which can output any language as easily as any other. And that might have been nice compared to Pascal in 1975, it's not so different to modern garbage collected high level scripting languages. Arguably Python or JavaScript will benefit an LLM most because there are so many training examples inside it, compared to almost any other langauge.

    replies(5): >>45903331 #>>45903911 #>>45904372 #>>45905822 #>>45906071 #
    2. nuc1e0n ◴[] No.45903331[source]
    What makes you think your brain isn't also brute forcing potential solutions subconciously and only surfacing the useful results?
    replies(3): >>45903373 #>>45903697 #>>45904109 #
    3. mkirsten ◴[] No.45903373[source]
    Can you try calculating 101 * 70 in your head?
    replies(3): >>45903488 #>>45903556 #>>45904347 #
    4. hacker_homie ◴[] No.45903488{3}[source]
    I think therefore I am calculator?
    5. ang_cire ◴[] No.45903556{3}[source]
    Um, that's really easy to do in your head, there's no carrying or anything? 7,070

    7 * 101 = 707 * 10 = 7,070

    And computers don't brute-force multiplication either, so I'm not sure how this is relevant to the comment above?

    replies(2): >>45904373 #>>45904833 #
    6. dbtc ◴[] No.45903697[source]
    Just intuition ;)
    7. riku_iki ◴[] No.45903911[source]
    Even in your example (which is obviously not correct representation of prolog), that code will work X orders magnitude faster and with 100% reliability compared to much more inferior LLM reasoning capabilities.
    replies(1): >>45904141 #
    8. troupo ◴[] No.45904109[source]
    human brains are insanely powerful pattern matching and shortcut-taking machines. There's very little brute forcing going on.
    replies(1): >>45906216 #
    9. szundi ◴[] No.45904141[source]
    This is not the point though
    replies(1): >>45905556 #
    10. johnisgood ◴[] No.45904347{3}[source]
    Very easy to solve, just like it is easy to solve many other ones once you know the tricks.

    I recommend this book: https://www.amazon.com/Secrets-Mental-Math-Mathemagicians-Ca...

    replies(1): >>45904808 #
    11. cpill ◴[] No.45904372[source]
    Of course it does "reasoning", what do you think reasoning is? From a quick google: "the action of thinking about something in a logical, sensible way". Prolog searches through a space of logical proposition (constraints) and finds conditions that lead to solutions (if one exists).

    (a) Trying adding another 100 or 1000 interlocking proposition to your problem. It will find solutions or tell you one doesn't exist. (b) You can verify the solutions yourself. You don't get that with imperative descriptions of problems. (b) Good luck sandboxing Python or JavaScript with the treat of prompt injection still unsolved.

    replies(1): >>45906317 #
    12. polotics ◴[] No.45904373{4}[source]
    I think it is very relevant, because no brute-forcing is involved in this solution.
    replies(1): >>45906109 #
    13. jabbywocker ◴[] No.45904808{4}[source]
    Completely missing the point on purpose?
    14. jabbywocker ◴[] No.45904833{4}[source]
    It’s almost like you’re proving the point of his reply…
    15. Onavo ◴[] No.45905556{3}[source]
    Algorithmically there's nothing wrong with using BFS/DFS to do reasoning as long as the logic is correct and the search space is constrained sufficiently. The hard part has always been doing the constraining, which LLMs seem to be rather good at.
    16. ux266478 ◴[] No.45905822[source]
    Everything you've written here is an invalid over-reduction, I presume because you aren't terribly well versed with Prolog. Your simplification is not only outright erroneous in a few places, but essentially excludes every single facet of Prolog that makes it a turing complete logic language. What you are essentially presenting Prolog as would be like presenting C as a language where all you can do is perform operations on constants, not even being able to define functions or preprocessor macros. To assert that's what C is would be completely and obviously ludicrous, but not so many people are familiar enough with Prolog or its underlying formalisms to call you out on this.

    Firstly, we must set one thing straight: Prolog definitionally does reasoning. Formal reasoning. This isn't debatable, it's a simple fact. It implements resolution (a computationally friendly inference rule over computationally-friendly logical clauses) that's sound and refutation complete, and made practical through unification. Your example is not even remotely close to how Prolog actually works, and excludes much of the extra-logical aspects that Prolog implements. Stripping it of any of this effectively changes the language beyond recognition.

    > Plain Prolog's way of solving reasoning problems is effectively:

    No. There is no cognate to what you wrote anywhere in how Prolog works. What you have here doesn't even qualify as a forward chaining system, though that's what it's closest to given it's somewhat how top-down systems work with their ruleset. For it to even approach a weaker forward chaining system like CLIPS, that would have to be a list of rules which require arbitrary computation and may mutate the list of rules it's operating on. A simple iteration over a list testing for conditions doesn't even remotely cut it, and again that's still not Prolog even if we switch to a top-down approach by enabling tabling.

    > You hard code some options

    A Prolog knowledgebase is not hardcoded.

    > write a logical condition with placeholders

    A horn clause is not a "logical condition", and those "placeholders" are just normal variables.

    > and Prolog brute-forces every option in every placeholder.

    Absolutely not. It traverses a graph proving things, and when it cannot prove something it backtracks and tries a different route, or otherwise fails. This is of course without getting into impure Prolog, or the extra-logical aspects it implements. It's a fundamentally different foundation of computation which is entirely geared towards formal reasoning.

    > And that might have been nice compared to Pascal in 1975, it's not so different to modern garbage collected high level scripting languages.

    It is extremely different, and the only reason you believe this is because you don't understand Prolog in the slightest, as indicated by the unsoundness of essentially everything you wrote. Prolog is as different from something like Javascript as a neural network with memory is.

    17. tannhaeuser ◴[] No.45906071[source]
    Prolog was introduced to capture natural language - in a logic/symbolic way that didn't prove as powerful as today's LLM for sure, but this still means there is a large corpus of direct English to Prolog mappings available for training, and also the mapping rules are much more straightforward by design. You can pretty much translate simple sentences 1:1 into Prolog clauses as in the classic boring example

        % "the boy eats the apple"
        eats(boy, apple).
    
    This is being taken advantage of in Prolog code generation using LLMs. In the Quantum Prolog example, the LLM is also instructed not to generate search strategies/algorithms but just planning domain representation and action clauses for changing those domain state clauses which is natural enough in vanilla Prolog.

    The results are quite a bit more powerful, close to end user problems, and upward in the food chain compared to the usual LLM coding tasks for Python and JavaScript such as boilerplate code generation and similarly idiosyncratic problems.

    18. nutjob2 ◴[] No.45906109{5}[source]
    That's not true, the 'brute force' part is searching for a shortcut that works.
    19. nutjob2 ◴[] No.45906216{3}[source]
    Your second sentence contradicts your first.
    20. jodrellblank ◴[] No.45906317[source]
    Of course it doesn't "do reasoning", why do you think "following the instructions you gave it in the stupidest way imaginable" is 'obviously' reasoning? I think one definition of reasoning is being able to come up with any better-than-brute-force thing that you haven't been explicitly told to use on this problem.

    Prolog isn't "thinking". Not about anything, not about your problem, your code, its implementation, or any background knowledge. Prolog cannot reason that your problem is isomorphic to another problem with a known solution. It cannot come up with an expression transform that hasn't been hard-coded into the interpreter which would reduce the amount of work involved in getting to a solution. It cannot look at your code, reason about it, and make a logical leap over some of the code without executing it (in a way that hasn't been hard-coded into it by the programmer/implementer). It cannot reason that your problem would be better solved with SLG resolution (tabling) instead of SLD resolution (depth first search). The point of my example being pseudo-Python was to make it clear that plain Prolog (meaning no constraint solver, no metaprogramming), is not reasoning. It's no more reasoning than that Python loop is reasoning.

    If you ask me to find the largest Prime number between 1 and 1000, I might think to skip even numbers, I might think to search down from 1000 instead of up from 1. I might not come up with a good strategy but I will reason about the problem. Prolog will not. You code what it will do, and it will slavishly do what you coded. If you code counting 1-1000 it will do that. If you code Sieve of Eratosthenes it will do that instead.

    > "Prolog searches through a space of logical proposition (constraints) and finds conditions that lead to solutions (if one exists)"

    This may be a matter of wording, but you are choosing words which make it sound more intelligent than it is. It does not find conditions that lead to solutions, any more than that Python loop "finds people who might be Timmy's parents".