Flowlog <img src="flowlog-logo.png" alt="Flowlog logo" style="height:1em; vertical-align:middle; margin-right:0.25em;">

7 min read Original article ↗

flowlog git repo

Flowlog is an ISO-style Prolog system implemented as a single, portable C file (flowlog.c), with a focus on running unmodified Prolog search faster on multicore CPUs.

It provides:

Why it exists

Prolog is a great fit for search problems, constraint-style programming, and symbolic manipulation, but classic implementations tend to exploit only limited parallelism automatically. Flowlog’s goal is to keep Prolog’s familiar ISO semantics while also making it easy to:

Quick start

git clone:

git clone https://git.liminal.cafe/byakuren/flowlog.git

Build:

Or compile directly:

cd flowlog
cc -O2 -Wall -Wextra -pthread flowlog.c -lm -o flowlog

Run the REPL:

Load a file and run a goal:

./flowlog program.pl -g 'main.'

Control the number of worker threads:

./flowlog --threads 12 program.pl -g 'goal(X).'

Engines (and defaults)

Flowlog ships three execution engines:

Select an engine:

./flowlog --engine wamvm   program.pl -g 'goal.'
./flowlog --engine wam     program.pl -g 'goal.'
./flowlog --engine interp  program.pl -g 'goal.'

Parallelism

Flowlog’s parallel features are opt-in/controllable so you can choose between classic behavior and maximum throughput:

The main user-facing switch is the parallel profile:

./flowlog --parallel-profile fast program.pl -g 'goal.'
./flowlog --parallel-profile iso  program.pl -g 'goal.'
./flowlog --parallel-profile off  program.pl -g 'goal.'

Flowlog also supports the same controls as Prolog flags (so an ISO Prolog program can enable them explicitly when running under Flowlog):

:- set_prolog_flag(flowlog_parallel_profile, fast).

Parse diagnostics (with context)

Flowlog’s parser reports errors with file/line/column, a one-line source excerpt, and a caret pointing at the offending token:

flowlog: fatal error (240): flowlog: parse error: unexpected token after term: ) (TOK_RPAREN); expected '.' (TOK_DOT)
  at incorrect-syntax.pl:6:12
  (unexpected token after a complete term; check for a missing ',' between goals or a missing operator)
  6 |   N is X + 1).
    |             ^

...

flowlog: fatal error (240): flowlog: unexpected token while parsing term: ) (TOK_RPAREN)
  at program.pl:1:6
  expected one of: '(', '[', atom, string, number, variable
  (')' closes a group/call; a term was expected before it)
  1 | p :- ).
    |      ^

See docs/TROUBLESHOOTING.md for more examples (including read_term/2,3 lexer errors like illegal_character_escape).

ISO conformance

Flowlog targets ISO/IEC 13211-1 behavior for the core language and built-in predicates. The recommended way to check conformance in this repo:

make test       # run regression tests
make inria      # run the inria test suite
make quad       # run all existing quad tests

To lock in that the INRIA suite runs entirely in the wamvm VM (no fallback):

Documentation

to-do file:

Start here:

Core references:

Parallel/runtime internals:

Contributing:

Benchmarks and tests:

Performance comparison

These tables are derived from the raw timing logs in this repo: magic_square_timings.txt and nqueens_timings.txt. Times are wall-clock real seconds (lower is better), sorted fastest -> slowest.

Magic square timings (magic_square(4, _)):

program engine profile time
magic_square(4) flowlog-wamvm fast 34.76s
magic_square(4) flowlog-wam fast 37.28s
magic_square(4) flowlog-wamvm iso 115.27s
magic_square(4) flowlog-wam iso 125.12s
magic_square(4) flowlog-tree fast 271.67s
magic_square(4) flowlog-tree iso 637.05s
magic_square(4) scryer-prolog - 1815.01s
magic_square(4) tpl - 2636.00s

N-queens timings (nqueens(13, _)):

program engine profile time
nqueens(13) flowlog-wamvm fast 1.82s
nqueens(13) flowlog-wam fast 6.95s
nqueens(13) flowlog-wamvm iso 7.57s
nqueens(13) flowlog-wam iso 7.71s
nqueens(13) flowlog-tree fast 14.19s
nqueens(13) flowlog-tree iso 25.00s
nqueens(13) scryer-prolog - 30.39s
nqueens(13) tpl - 41.42s

A short history of parallel Prolog (and what’s different here)

Parallel execution in Prolog has a long research lineage:

Flowlog’s approach is:


If you’re new: start with QUICKSTART.md, then skim USER_GUIDE.md and PARALLELISM.md.

Version history

Flowlog has gone through a few distinct implementation phases. This is a high-level timeline of the ideas that shaped the current system:

The best way to contact me with any feedback, or even just to chat is on IRC

see you there!