roberthoenig / FirstOrderLogic.jl

Julia package for parsing, manipulating and evaluating formulas in first-order logic.
Other
19 stars 6 forks source link
first-order-logic julia logic satisfiability-solver

FirstOrderLogic.jl | Overview | Installation | Usage | Why not PROLOG? | Roadmap

FirstOrderLogic.jl

This is a Julia package for parsing, manipulating and evaluating formulas in first-order logic. It may prove useful to

For example, to check if ∀x(P(x) ∧ ¬P(f(x))) is unsatisfiable, run

is_satisfiable("*{x}(P(x) & ~P(f(x)))")

Overview

Linux Windows Coverage

FirstOrderLogic.jl follows the standard structure for Julia projects. Currently, it provides the following:

Installation

  1. Run
    julia
  2. In your Julia shell, run
    Pkg.clone("git@github.com:roberthoenig/FirstOrderLogic.jl.git")

Usage

Quick walkthrough

Say we have a formula ∀x(P(x) ∧ ¬P(f(x))). We want to verify that this formula is unsatisfiable. To do so, we do the following:

  1. Type the formula in FirstOrderLogic.jl syntax: *{x}(P(x) & P(f(x))).
  2. Run
    julia
  3. Import FirstOrderLogic.jl:
    using FirstOrderLogic
  4. Run is_satisfiable(<our formula>):
    is_satisfiable("*{x}(P(x) & ~P(f(x)))")

    If everything works correctly, the program should print "false" and terminate. This means that ∀x(P(x) ∧ ¬P(f(x))) is unsatisfiable. We have verified what we wanted to verify.

Formula syntax

FirstOrderLogic.jl currently uses its own syntax for representing formulas in first-order logic. A parser for latex symbols is in progress.

The following is a list of all currently supported syntactic elements.

Mathematical syntax FirstOrderLogic.jl syntax Semantic
x x variable
f(x,y) f(x,y) function
f(x,y) f(x,y) predicate
∃x ?{x} existential quantification
∀x *{x} universal quantification
¬x ~x negation
x ∧ y x & y conjunction
x ∨ y x | y disjunction
x → y x > y implication
(x ∧ y) ∨ z (x & y) | z precedence grouping

Example

Formula in mathematical notation:

∀x∃yA(x,g(y,z)) ∧ (¬B() ∨ ∃dC(d))

The same formula in FirstOrderLogic.jl notation:

*{x}?{y}A(x,g(y,z)) & (~B() | ?{d}C(d))

Some important functions

Function Purpose
is_satisfiable(formula; maxsearchdepth) Checks if formula is satisfiable.
get_conjunctive_normal_form(formula) Returns formula in the conjunctive normal form, expressed as clauses.
get_prenex_normal_form(formula) Returns the prenex normal form of formula.
get_skolem_normal_form(formula) Returns the skolem normal form of formula.
Formula(str) Parse str to a Formula object and return that object.

Each available function comes with a concise docstring.

How is this different from PROLOG?

The PROLOG programming language can be used to prove seemingly arbitrary statements in first-order logic. PROLOG differs from FirstOrderLogic.jl in two ways:

Roadmap

The following features are work in progress:

Any and all external contributions are most welcome!