MCPcopy Index your code
hub / github.com/HarvardPL/formulog

github.com/HarvardPL/formulog @v0.8.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.8.0 ↗ · + Follow
3,202 symbols 9,361 edges 304 files 41 documented · 1%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Formulog

Build Status

TL;DR: write SMT-based program analyses (symbolic executors, refinement type checkers, etc.) in an optimized Datalog-like language.

Datalog has proven to be a useful language for implementing a range of program analyses, but analyses that use SMT solving cannot be easily written in traditional versions of Datalog. Formulog sets out to fill this gap by augmenting Datalog with ways to construct and reason about SMT formulas, as well as some first-order functional programming to make life easier.

Why write your SMT-based analysis in Formulog?

  1. By combining logic programming, functional programming, and SMT solving, Formulog makes it possible to encode many analyses declaratively at the level of mathematical specification (e.g., inference rules), closing the gap between specification and implementation---and often revealing bugs in the spec!
  2. This high-level encoding makes it possible for Formulog to apply high-level optimizations to your analysis, like automatic parallelization and goal-directed evaluation.
  3. Thanks to our Formulog-to-Soufflé compiler, you can automatically generate a C++ version of the analysis that leverages highly optimized Datalog algorithms and data structures.

Interested? For more information, check out the Formulog docs (also available in the docs directory), including tips on getting started and the language reference. To get a sense for what's involved in building a nontrivial SMT-based analysis in Formulog, check out our tutorial on implementing a refinement type checker in Formulog.

Contributing

Contributions to this project are most welcome! Please open a GitHub issue and then link a pull request to it. Pull requests must be in the Google Java format before being merged. 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.

Licensing and Third-Party Libraries

Formulog is released under an Apache 2.0 license.

This project uses third-party libraries. You can generate a list of these libraries and download their associated licenses with this command:

mvn license:download-licenses

The generated content can be found in the target/generated-resources/ directory.

Extension points exported contracts — how you extend this code

Node (Interface)
This interface represents a node in the pattern match tree. [24 implementers]
src/main/java/edu/harvard/seas/pl/formulog/codegen/PatternMatchTree.java
Tester (Interface)
(no doc) [10 implementers]
src/test/java/edu/harvard/seas/pl/formulog/eval/Tester.java
TypeVisitor (Interface)
(no doc) [26 implementers]
src/main/java/edu/harvard/seas/pl/formulog/types/Types.java
SmtLibSolver (Interface)
(no doc) [12 implementers]
src/main/java/edu/harvard/seas/pl/formulog/smt/SmtLibSolver.java
ExternalSolverProcessFactory (Interface)
(no doc) [8 implementers]
src/main/java/edu/harvard/seas/pl/formulog/smt/ExternalSolverProcessFactory.java
StratumEvaluator (Interface)
(no doc) [16 implementers]
src/main/java/edu/harvard/seas/pl/formulog/eval/StratumEvaluator.java

Core symbols most depended-on inside this repo

add
called by 319
src/main/java/edu/harvard/seas/pl/formulog/db/IndexedFactDb.java
get
called by 265
src/main/java/edu/harvard/seas/pl/formulog/db/IndexedFactDb.java
print
called by 244
src/main/java/edu/harvard/seas/pl/formulog/codegen/ast/cpp/CppExpr.java
println
called by 228
src/main/java/edu/harvard/seas/pl/formulog/codegen/ast/cpp/CppStmt.java
test
called by 219
src/test/java/edu/harvard/seas/pl/formulog/eval/Tester.java
size
called by 171
src/main/java/edu/harvard/seas/pl/formulog/util/Dataset.java
smt
called by 123
src/main/java/edu/harvard/seas/pl/formulog/types/BuiltInTypes.java
getSymbol
called by 117
src/main/java/edu/harvard/seas/pl/formulog/ast/Functor.java

Shape

Method 2,603
Class 335
Function 115
Enum 86
Interface 63

Languages

Java91%
C++9%

Modules by API surface

src/main/java/edu/harvard/seas/pl/formulog/functions/BuiltInFunctionDefFactory.java190 symbols
src/test/java/edu/harvard/seas/pl/formulog/eval/CommonEvaluationTest.java176 symbols
src/main/java/edu/harvard/seas/pl/formulog/ast/Constructors.java94 symbols
src/main/java/edu/harvard/seas/pl/formulog/magic/MagicSetTransformer.java85 symbols
src/main/java/edu/harvard/seas/pl/formulog/types/Types.java74 symbols
src/main/resources/codegen/src/funcs.hpp65 symbols
src/main/java/edu/harvard/seas/pl/formulog/codegen/PatternMatchTree.java60 symbols
src/main/java/edu/harvard/seas/pl/formulog/db/SortedIndexedFactDb.java59 symbols
src/main/java/edu/harvard/seas/pl/formulog/parsing/TermExtractor.java53 symbols
src/main/java/edu/harvard/seas/pl/formulog/types/TypeChecker.java51 symbols
src/main/java/edu/harvard/seas/pl/formulog/smt/SmtLibShim.java51 symbols
src/test/java/edu/harvard/seas/pl/formulog/magic/CommonMagicSetTest.java46 symbols

For agents

$ claude mcp add formulog \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact