[HN Gopher] Demo of a WAM Prolog Implementation in Python
       ___________________________________________________________________
        
       Demo of a WAM Prolog Implementation in Python
        
       Author : triska
       Score  : 65 points
       Date   : 2021-10-01 15:50 UTC (7 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | emmanueloga_ wrote:
       | Very cool! This seems like a natural follow up to [1], a nice
       | tutorial on building a simple prolog interpreter with Python.
       | 
       | 1: https://www.openbookproject.net/py4fun/prolog/prolog1.html
        
       | tehnub wrote:
       | This looks like a good codebase to learn modern Python style and
       | features from. I found it quite readable despite not being very
       | familiar with this sort of programming.
        
       | platz wrote:
       | But is it Detotated WAM?
        
         | mhh__ wrote:
         | Hah. That was the intrusive thought in my head reading about
         | the WAM
        
       | triska wrote:
       | The WAM is _Warren 's Abstract Machine_, introduced by David H.
       | D. Warren in his 1983 paper _An abstract Prolog instruction set_
       | :
       | 
       | http://www.ai.sri.com/pubs/files/641.pdf
       | 
       | This invention showed conclusively, and for the first time, that
       | Prolog code can be very efficiently executed, and is even more
       | efficient than Lisp in many cases of practical relevance due to
       | its efficient reclamation of memory on backtracking which does
       | not require garbage collection:
       | 
       | http://www-public.int-evry.fr/~gibson/Teaching/CSC4504/Readi...
       | 
       | The WAM has since become a popular target architecture for
       | efficient Prolog execution, analogous to the BEAM in Erlang etc.:
       | 
       | https://en.wikipedia.org/wiki/Warren_Abstract_Machine
       | 
       | Several popular Prolog systems, including GNU Prolog, Scryer
       | Prolog and SICStus Prolog, compile Prolog code to WAM code and
       | then interpret the abstract machine code for good efficiency.
       | 
       | One interesting feature of the WAM is that it is register-based,
       | not stack-based. Hassan Ait-Kaci's tutorial is a nice
       | introduction to the WAM:
       | 
       | http://wambook.sourceforge.net/
       | 
       | There are several other used and proposed abstract machine
       | architectures for Prolog, such as the ZIP, TOAM and the Vienna
       | Abstract Machine (VAM). Andreas Krall's paper contains many
       | interesting implementation techniques:
       | 
       | https://www.complang.tuwien.ac.at/andi/papers/wlp_94.pdf
        
         | melony wrote:
         | Are there any recent advances in Prolog
         | compilation/implementation post-Y2K? Or has GOFAI development
         | stalled in general?
        
           | triska wrote:
           | Yes, definitely, there are several recent advances in Prolog
           | implementation techniques!
           | 
           | For example, _just-in-time (JIT) compilation_ , i.e.,
           | compilation to native code. Quoting from the SICStus
           | documentation
           | https://sicstus.sics.se/sicstus/docs/latest4/pdf/sicstus.pdf
           | :
           | 
           |  _" Since release 4.3, on 32 and 64 bit x86 platforms running
           | Windows, OS X, and Linux, SICStus Prolog has the ability to
           | compile predicates from virtual machine code to native code.
           | This process, known as Just In Time (JIT) compilation, is
           | controlled by a couple of system properties (see Section
           | 4.17.1 [System Properties and Environment Variables], page
           | 224), but is otherwise automatic. JIT compilation is seamless
           | wrt. debugging, profiling, coverage analysis, etc. JIT
           | compiled code runs up to 4 times faster than virtual machine
           | code, but takes more space."_
           | 
           | As another example, one of the most recent and also very
           | significant innovations in Prolog implementations happened in
           | 2020, when Scryer Prolog became the first Prolog system to
           | implement a very compact internal representation of lists of
           | characters, internally storing them as sequences of raw bytes
           | in UTF-8 encoding instead of compound terms, while Prolog
           | code "sees" them as lists and can therefore reason about them
           | with conventional predicates over lists.
           | 
           | Trealla Prolog took up this idea and now already allows the
           | efficient application of Prolog definite clause grammars
           | (DCGs) to entire files (using phrase_from_file/2) by
           | _mmapping the entire file to memory_ , i.e., using the
           | operating system to transparently process the file as if it
           | were loaded, without having to load it in its entirety into
           | memory. This paves the way for the use case Prolog was
           | designed for: efficient and convenient reasoning about large
           | amounts of text.
        
             | maweki wrote:
             | I wonder how Tauprolog with all the JS jit-stuff compares.
        
             | e12e wrote:
             | Thanks for mentioning traella - doesn't look like it gained
             | much traction last time it was brought up:
             | 
             | https://news.ycombinator.com/item?id=26313792
        
         | sigstoat wrote:
         | thanks for the references, and the followup comment.
        
       | [deleted]
        
       | memco wrote:
       | If you're interested in implementing languages in Python, I've
       | been enjoying watching the development of Porth[0], a stack-
       | based, forth-like* language on Twitch.
       | 
       | * See readme disclaimer that there's no actual connection to
       | Forth other than the stack-based design.
       | 
       | [0]: https://github.com/tsoding/porth
        
       ___________________________________________________________________
       (page generated 2021-10-01 23:01 UTC)