Pytholog

Pytholog (Logic Programming in Python)

Python open source project under MIT License that enables using logic programming in python mimicking Prolog syntax and backtracking. The aim of the project is to explore ways to use symbolic reasoning with machine learning. It also performs probabilistic and logical reasoning.

Github link : https://github.com/MNoorFawi/pytholog

Pytholog gives facts indices (first term) and uses binary search to search for relevant facts instead of looping over all knowledge base. So when defining rules, make sure that the main search terms are in the first position to speed up the search queries.

The project consists of two components; a Python library and a command line tool.

Python Library

The library can be installed easily using the pip command

pip install pytholog

For a quick start, you can have a look at: https://minimatech.org/logic-programming-in-python-with-pytholog/

While the full documentation can be found here https://mnoorfawi.github.io/pytholog/

Pytholog Tool (Command line & API)

Pytholog tool is an executable tool, built in python, that enables logic programming and prolog syntax through interactive shell that mimics prolog language and / or RESTful API that can be called from other applications. The tool can be found at SourceForge here: https://sourceforge.net/projects/pytholog/

The tools in the project work in Linux and Windows and there is also the script to be built on OSX system.

Quick Start

The tool starts normally from the command line. Let’s look at the arguments that can be specified while initiating the tool:

./Pytholog -h
usage: Pytholog [-h] [-c CONSULT] -n NAME [-i] [-a]

pytholog executable tool: prolog experience at command line and a logic knowledge base with no dependencies

optional arguments:
  -h, --help            show this help message and exit
  -c CONSULT, --consult CONSULT
                        read an existing prolog file/knowledge base
  -n NAME, --name NAME  knowledge base name
  -i, --interactive     start an interactive prolog-like session
  -a, --api             start a flask api

As we can see, we have 4 parameters: -n –name which is the only required parameter that is used to give a name to the session, -c –consult which can be used in case we have a pre-existing knowledge base, -i –interactive to start an interactive prolog-like session and -a –api that starts a RESTful API written in python/flask. By default it starts the API.

Let’s now try the tool with the accompanied dummy knowledge base

First, the interactive shell

./Pytholog -c dummy.txt -n dummy -i

facts and rules have been added to dummy.db
?- prin
invalid input
 please type 'print' to print the knowledge base
 or 'quit' to save and exit
?- print
[likes(assel,limonade), likes(dmitry,cookie), likes(melissa,pasta), likes(nikita,sausage), likes(noor,sausage)]
[food_type(cookie,dessert), food_type(gouda,cheese), food_type(limonade,juice), food_type(ritz,cracker), food_type(sausage,meat), food_type(steak,meat)]
[flavor(savory,meat), flavor(savory,cheese), flavor(sweet,dessert), flavor(sweet,juice)]
[food_flavor(X,Y):-food_type(X,Z),flavor(Y,Z)]
?- likes(noor, sausage)?
['Yes']
?- likes(nikita, cheese)?
['No']
?- likes(noor, What)?
[{'What': 'sausage'}]
?- food_flavor(What, sweet)?
[{'What': 'cookie'}, {'What': 'limonade'}]
?- dish_to_like(X, Y) :- likes(X, L), food_type(L, T), flavor(F, T), food_flavor(Y, F).
?- dish_to_like(noor, What)!
[{'What': 'gouda'}]
?- quit
KnowledgeBase is saved into dummy.pl file

Note the usage of ‘.’ is optional and ‘?’ is required to differentiate between a query and a new fact to be inserted to the knowledge base. And the ‘!’ is used to cut and return the first encountered answer.

Now the API

./Pytholog -c dummy.txt -n dummy -a

facts and rules have been added to dummy.db
 * Serving Flask app "Pytholog" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
facts and rules have been added to dummy.db
 * Debugger is active!
 * Debugger PIN: 222-740-882

Let’s try to call the API from command line, python and R and in the browser

Note that spaces can cause some errors

From R

library(httr)
library(jsonlite)

GET("http://127.0.0.1:5000/query?expr=food_flavor(What,savory)")

# Response [http://127.0.0.1:5000/query?expr=food_flavor(What,savory)]
#   Date: 2020-11-13 19:26
#   Status: 200
#   Content-Type: application/json
#   Size: 94 B
# [
#   {
#     "What": "gouda"
#   }, 
#   {
#     "What": "sausage"
#   }, 
#   {
#     "What": "steak"
#   }
# ...

From Command line

curl -s -X POST "http://127.0.0.1:5000/insert?expr=dish_to_like(X,Y):-likes(X,L),food_type(L,T),flavor(F,T),food_flavor(Y,F)"
"OK"

From Python

import json
import requests

url = "http://127.0.0.1:5000/query?expr=dish_to_like(noor,What)!"
r = requests.get(url)

d = json.loads(r.content)
d

# [{'What': 'gouda'}]

From browser put this into the browser http://127.0.0.1:5000/save and it will give you “KnowledgeBase is saved into dummy.pl file” and a dummy.pl file will be created.

Share

Leave a Reply

Your email address will not be published. Required fields are marked *