You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+5-312Lines changed: 5 additions & 312 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,318 +14,9 @@ Formulog sets out to fill this gap by augmenting Datalog with ways to construct
14
14
3. Thanks to our [Formulog-to-Soufflé compiler](#compiling-formulog-programs), you can automatically generate a C++ version of the analysis that leverages highly optimized Datalog algorithms and data structures.
15
15
16
16
**Interested?**
17
+
For more information, check out the [Formulog docs](https://harvardpl.github.io/formulog/) (also available in the [docs](./docs/) directory), including [tips on getting started](https://harvardpl.github.io/formulog/starting.html) and the [language reference](https://harvardpl.github.io/formulog/lang_ref/).
17
18
To get a sense for what's involved in building a nontrivial SMT-based analysis in Formulog,
18
-
check out our [tutorial](./docs/tutorial/tutorial.md) on implementing a refinement type checker in Formulog.
19
-
For more tips on where to start, check out the section on [writing Formulog programs](#writing-formulog-programs) later in this document.
20
-
21
-
## Setup
22
-
23
-
### Prepackaged JAR
24
-
25
-
You can find a prepackaged JAR file in the Releases section of the GitHub
26
-
repository.
27
-
28
-
Dependencies:
29
-
30
-
* JRE 11+
31
-
* A supported SMT solver (see discussion below)
32
-
33
-
### Docker
34
-
35
-
Prebuilt images are available
36
-
on [Docker Hub](https://hub.docker.com/r/aaronbembenek/formulog). If you have
37
-
Docker installed, you can spin up an Ubuntu container with Formulog and some
38
-
example programs by running this command:
39
-
40
-
```bash
41
-
docker run -it aaronbembenek/formulog:0.7.0 # may require sudo
42
-
```
43
-
44
-
This should place you in the directory `/root/formulog/`. From here, you should
45
-
be able to run the following command and see some greetings:
As an alternative to being directly interpreted, Formulog programs can be compiled into a mix of C++ and Souffle code, which can then in turn be compiled into an efficient executable.
226
-
To enable compilation, set the `--codegen` (`-c`) flag; generated code will be placed in the directory `./codegen/` (you can change this using the `--codegen-dir` option).
227
-
Within this directory you can use `cmake` to compile the generated code into a binary named `flg`.
228
-
229
-
For example, to compile and execute the `greeting.flg` program from above, you can use these steps:
Use the command `./build/flg -h` see options available when running the executable.
256
-
257
-
### Dependencies
258
-
259
-
To build the generated code, you must have:
260
-
261
-
- A C++ compiler that supports the C++17 standard (and OpenMP, if you want to produce a parallelized binary)
262
-
-`cmake` (v3.21+)
263
-
-[`boost`](https://www.boost.org/) (a version compatible with v1.81)
264
-
-[`oneTBB`](https://oneapi-src.github.io/oneTBB/) (v2021.8.0 is known to work)
265
-
-[`souffle`](https://souffle-lang.github.io/) (v2.3 is known to work)
266
-
267
-
The Formulog Docker image already has these dependencies installed.
268
-
269
-
## SMT solver modes and incremental SMT solving
270
-
271
-
The Formulog runtime associates one external SMT solver process per Formulog
272
-
worker thread. Each SMT query is a list of conjuncts. If the SMT solver is
273
-
invoked via the `is_sat_opt` or `get_model_opt` function, this list is
274
-
explicitly given by the programmer; otherwise, if the solver is invoked via the
275
-
`is_sat` or `is_valid` function, the Formulog runtime breaks the supplied
276
-
proposition into conjuncts. Formulog supports three strategies for interacting
277
-
with external SMT solvers; they can be set using the `--smt-solver-mode` option.
278
-
Consider two SMT queries `x` and `y`, where `x` immediately precedes `y` and
279
-
both are lists of conjuncts.
280
-
281
-
-`naive`: reset the solver between queries `x` and `y` (do not use incremental
282
-
SMT solving).
283
-
-`push-pop`: try to use incremental SMT solving via the `push` and `pop` SMT
284
-
commands. This can work well when query `y` extends query `x`; e.g., `y = c ::
285
-
x`, where `c` is an additional conjunct; this situation most commonly occurs
286
-
when using [eager evaluation](#eager-evaluation).
287
-
-`check-sat-assuming`: try to use incremental SMT solving via the
288
-
`check-sat-assuming` SMT command. This caches conjuncts in the SMT solver in a
289
-
way such that they can be enabled or disabled per SMT query, and works well if
290
-
there are shared conjuncts between queries `x` and `y`, but query `x` is not
291
-
simply an extension of query `y` (e.g., it omits a conjunct in query `y`).
292
-
293
-
For more information, see the ICLP'20 extended abstract [Datalog-Based Systems Can Use Incremental SMT Solving](https://aaronbembenek.github.io/papers/datalog-incr-smt-iclp2020.pdf)
294
-
by Aaron Bembenek, Michael Ballantyne, Michael Greenberg, and Nada Amin.
295
-
296
-
## Eager evaluation
297
-
298
-
In addition to traditional semi-naive Datalog evaluation, Formulog supports _eager_ evaluation, a novel concurrent evaluation algorithm for Datalog that is faster than semi-naive evaluation on some Formulog workloads (often because it induces a more favorable distribution of the SMT workload across SMT solvers).
299
-
Whereas semi-naive evaluation batches derived tuples to process them in explicit rounds, eager evaluation eagerly pursues the consequences of each tuple as it is derived.
300
-
301
-
Using eager evaluation with the Formulog interpreter is easy: just add the `--eager-eval` flag.
302
-
Eager evaluation can also be used with the Formulog compiler, provided you install [our custom version of Souffle](https://github.com/aaronbembenek/souffle).
303
-
When you configure `cmake` on the generated code, you need to add `-DFLG_EAGER_EVAL=On`.
304
-
For example, to build a version of the greeting program that uses eager evaluation, use these commands:
305
-
306
-
```shellsession
307
-
$ java -jar formulog.jar -c greeting.flg
308
-
$ cd codegen
309
-
$ cmake -B build -S . -DFLG_EAGER_EVAL=On
310
-
$ cmake --build build -j
311
-
$ ./build/flg --dump-idb
312
-
```
313
-
314
-
## Writing Formulog programs
315
-
316
-
Check out our [tutorial](./docs/tutorial/tutorial.md) for a walk-through of how to encode a refinement type system in Formulog.
317
-
Additional shortish example programs can be found in the [examples](./examples) directory.
318
-
For examples of larger developments, see the case studies we have used in publications:
319
-
320
-
-[a refinement type checker](https://github.com/aaronbembenek/making-formulog-fast/blob/main/benchmarks/dminor/bench.flg)
321
-
-[a bottom-up points-to analysis for Java](https://github.com/aaronbembenek/making-formulog-fast/blob/main/benchmarks/scuba/bench.flg)
322
-
-[a symbolic executor an LLVM fragment](https://github.com/aaronbembenek/making-formulog-fast/blob/main/benchmarks/symex/bench.flg)
323
-
324
-
See the [language reference](./docs/00_language_ref.md) for details about Formulog constructs.
325
-
326
-
Syntax highlighting is available for Visual Studio Code (follow instructions [here](https://github.com/HarvardPL/formulog-syntax)) and Vim (install [misc/flg.vim](./misc/flg.vim)).
327
-
328
-
Finally, please raise a [GitHub issue](https://github.com/HarvardPL/formulog/issues/new) if you want to try out Formulog but need additional information/assistance---we're happy to help! :)
19
+
check out our [tutorial](https://harvardpl.github.io/formulog/tutorial/) on implementing a refinement type checker in Formulog.
329
20
330
21
## Contributing
331
22
@@ -334,7 +25,9 @@ Please open a [GitHub issue](https://github.com/HarvardPL/formulog/issues/new) a
334
25
Pull requests must be in the [Google Java format](https://github.com/google/google-java-format) before being merged.
335
26
To reformat your code, run `mvn spotless:apply`; you can also check if your code is conformant (without reformatting it) by running `mvn spotless:check`.
336
27
337
-
## Third-party libraries
28
+
## Licensing and Third-Party Libraries
29
+
30
+
Formulog is released under an [Apache 2.0 license](./LICENSE.txt).
338
31
339
32
This project uses third-party libraries. You can generate a list of these
340
33
libraries and download their associated licenses with this command:
0 commit comments