GithubHelp home page GithubHelp logo

logpy's Introduction

LogPy

Logic Programming in Python

Examples

LogPy enables the expression of relations and the search for values which satisfy them. The following code is the "Hello, world!" of logic programming. It asks for 1 number, x, such that x == 5

>>> from logpy import run, eq, membero, var, conde
>>> x = var()
>>> run(1, x, eq(x, 5))
(5,)

Multiple variables and multiple goals can be used simultaneously. The following code asks for a number x such that x == z and z == 3

>>> z = var()
>>> run(1, x, eq(x, z),
              eq(z, 3))
(3,)

LogPy uses unification, an advanced form of pattern matching, to match within expression trees. The following code asks for a number, x, such that (1, 2) == (1, x) holds.

>>> run(1, x, eq((1, 2), (1, x)))
(2,)

The above examples use eq, a goal constructor to state that two expressions are equal. Other goal constructors exist such as membero(item, coll) which states that item is a member of coll, a collection.

The following example uses membero twice to ask for 2 values of x, such that x is a member of (1, 2, 3) and that x is a member of (2, 3, 4).

>>> run(2, x, membero(x, (1, 2, 3)),  # x is a member of (1, 2, 3)
              membero(x, (2, 3, 4)))  # x is a member of (2, 3, 4)
(2, 3)

Representing Knowledge

LogPy stores data as facts that state relationships between terms.

The following code creates a parent relationship and uses it to state facts about who is a parent of whom within the Simpsons family.

>>> from logpy import Relation, facts
>>> parent = Relation()
>>> facts(parent, ("Homer", "Bart"),
...               ("Homer", "Lisa"),
...               ("Abe",  "Homer"))

>>> run(1, x, parent(x, "Bart"))
('Homer',)

>>> run(2, x, parent("Homer", x))
('Lisa', 'Bart')

We can use intermediate variables for more complex queries. Who is Bart's grandfather?

>>> y = var()
>>> run(1, x, parent(x, y),
              parent(y, 'Bart'))
('Abe',)

We can express the grandfather relationship separately. In this example we use conde, a goal constructor for logical and and or.

>>> def grandparent(x, z):
...     y = var()
...     return conde((parent(x, y), parent(y, z)))

>>> run(1, x, grandparent(x, 'Bart'))
('Abe,')

Data Structures

LogPy depends on functions, tuples, dicts, and generators. There are almost no new data structures/classes in LogPy so it should be simple to integrate into preexisting code.

Extending LogPy to other Types

LogPy uses Multiple Dispatch to support pattern matching on user defined types. (Also see unification (wikipedia) and logpy source)

from logpy import unify, var
from logpy.dispatch import dispatch

class Account(object):
    def __init__(self, name, amount):
        self.name = name
        self.amount = amount
    def __str__(self):
        return "%s: $%d" % (self.name, self.account)


@dispatch(Account, Account, dict)
def _unify(u, v, s):
    """ Unify accounts by unifying a tuple of their type, name and amount """
    uu = (type(u), u.name, u.amount)
    vv = (type(v), v.name, v.amount)

    return unify(uu, vv, s)


>>> x = var('x')

>>> unify(Account('Alice', 100), Account(x, 100), {})
{x: 'Alice'}

>>> unify(Account('Alice', 100), Account(x, 200), {})
False

Alternatively just decorate your classes with the @unifiable class decorator

from logpy import unifiable

@unifiable
class Account(object):
    ...

Install

With pip or easy_install

pip install logic

From source

git clone [email protected]:logpy/logpy.git
cd logpy
python setup.py install

Run tests with nose

nosetests --with-doctest

Dependencies

LogPy supports Python 2.6+ and Python 3.2+ with a common codebase. It is pure Python and requires no dependencies beyond the standard library, toolz and multipledispatch.

It is, in short, a light weight dependency.

Author

Matthew Rocklin

License

New BSD license. See LICENSE.txt

Motivation

Logic programming is a general programming paradigm. This implementation however came about specifically to serve as an algorithmic core for Computer Algebra Systems in Python and for the automated generation and optimization of numeric software. Domain specific languages, code generation, and compilers have recently been a hot topic in the Scientific Python community. LogPy aims to be a low-level core for these projects.

References

logpy's People

Contributors

alexrudnick avatar creatorrr avatar jaberg avatar jdmcbr avatar mrocklin avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.