Soufflé (programming language)
- 2 min read
- 3 chapters
Related on Lably
Through Open source, Logic programming and Graph (discrete mathematics)
Programming examples
Given a set of edges in a graph, the following program computes the set of (directed) paths between any two nodes. This is also known as the transitive closure of the edge relation.
<span id="mwIQ"></span><span class="p" id="mwIg">.</span><span class="s s-Atom" id="mwIw">decl</span> <span class="nf" id="mwJA">edge</span><span class="p" id="mwJQ">(</span><span class="nn" id="mwJg">x</span><span class="p" id="mwJw">:</span><span class="s s-Atom" id="mwKA">number</span><span class="p" id="mwKQ">,</span> <span class="nn" id="mwKg">y</span><span class="p" id="mwKw">:</span><span class="s s-Atom" id="mwLA">number</span><span class="p" id="mwLQ">)</span> <span class="p" id="mwLg">.</span><span class="s s-Atom" id="mwLw">input</span> <span class="s s-Atom" id="mwMA">edge</span> <span class="p" id="mwMQ">.</span><span class="s s-Atom" id="mwMg">decl</span> <span class="nf" id="mwMw">path</span><span class="p" id="mwNA">(</span><span class="nn" id="mwNQ">x</span><span class="p" id="mwNg">:</span><span class="s s-Atom" id="mwNw">number</span><span class="p" id="mwOA">,</span> <span class="nn" id="mwOQ">y</span><span class="p" id="mwOg">:</span><span class="s s-Atom" id="mwOw">number</span><span class="p" id="mwPA">)</span> <span class="p" id="mwPQ">.</span><span class="s s-Atom" id="mwPg">output</span> <span class="s s-Atom" id="mwPw">path</span> <span class="nf" id="mwQA">path</span><span class="p" id="mwQQ">(</span><span class="s s-Atom" id="mwQg">x</span><span class="p" id="mwQw">,</span> <span class="s s-Atom" id="mwRA">y</span><span class="p" id="mwRQ">)</span> <span class="p" id="mwRg">:-</span> <span class="nf" id="mwRw">edge</span><span class="p" id="mwSA">(</span><span class="s s-Atom" id="mwSQ">x</span><span class="p" id="mwSg">,</span> <span class="s s-Atom" id="mwSw">y</span><span class="p" id="mwTA">).</span> <span class="nf" id="mwTQ">path</span><span class="p" id="mwTg">(</span><span class="s s-Atom" id="mwTw">x</span><span class="p" id="mwUA">,</span> <span class="s s-Atom" id="mwUQ">y</span><span class="p" id="mwUg">)</span> <span class="p" id="mwUw">:-</span> <span class="nf" id="mwVA">path</span><span class="p" id="mwVQ">(</span><span class="s s-Atom" id="mwVg">x</span><span class="p" id="mwVw">,</span> <span class="s s-Atom" id="mwWA">z</span><span class="p" id="mwWQ">),</span> <span class="nf" id="mwWg">edge</span><span class="p" id="mwWw">(</span><span class="s s-Atom" id="mwXA">z</span><span class="p" id="mwXQ">,</span> <span class="s s-Atom" id="mwXg">y</span><span class="p" id="mwXw">).</span>
Sign in to keep reading
2 more chapters are free with a Lably account.
Features
- An interpreter and a compiler that targets parallel C++ (C++ that uses OpenMP). Both the interpreter and compiler use semi-naïve evaluation.
- Stratified negation
- Aggregation
- Automatic index selection
- Specialized parallel data structures, including disjoint-sets, B-trees, and tries.
- Static typing
- Records and algebraic data types
- A foreign function interface
Related tools
In addition to a compiler and an interpreter, the Soufflé project also publishes:
- a profiler,
- a "provenance"-based debugger,
- an "auto-scheduler" (also called a "join optimizer") that chooses efficient query plans based on a profile, as in profile-guided optimization.
Applications
Soufflé has been used to build static analyzers, including:
- A pointer analysis for Java
- A control-flow analysis for Scheme
- Various analyses for smart contract languages
It has also been used to build tools for binary analysis, including reverse engineering, and disassemblers.

