Skip to content

Commit

Permalink
Merge pull request #24 from robjsliwa/makelib
Browse files Browse the repository at this point in the history
Prepared the code for release as a library.
  • Loading branch information
robjsliwa authored Jul 5, 2024
2 parents 2f63199 + 73a131b commit 0bb4f54
Show file tree
Hide file tree
Showing 19 changed files with 343 additions and 733 deletions.
40 changes: 22 additions & 18 deletions .github/workflows/python-package.yml
Original file line number Diff line number Diff line change
@@ -1,39 +1,43 @@
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions

name: pyprolog
name: Python package

on:
push:
branches: [ main ]
branches:
- '**'
pull_request:
branches: [ main ]
branches:
- '**'

jobs:
build:
test:

runs-on: ubuntu-latest

strategy:
fail-fast: false
matrix:
python-version: [3.7, 3.8, 3.9]
python-version: ['3.10', '3.11', '3.12']

steps:
- uses: actions/checkout@v2
- name: Check out repository
uses: actions/checkout@v3

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}

- name: Install dependencies
run: |
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
source $HOME/.poetry/env
poetry install
python -m pip install --upgrade pip
pip install flake8 pytest
- name: Lint with flake8
run: |
source $HOME/.poetry/env
poetry run flake8
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with pytest
run: |
source $HOME/.poetry/env
poetry run pytest --cov=prolog tests
pytest
13 changes: 13 additions & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
include README.md
include LICENSE

include requirements.txt

graft prolog

global-exclude __pycache__
global-exclude *.py[cod]
global-exclude *.so
global-exclude *.dylib
global-exclude *.dll
global-exclude .DS_Store
87 changes: 69 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,44 @@
![badges](https://github.com/robjsliwa/pyprolog/actions/workflows/python-package.yml/badge.svg)
[![license](https://img.shields.io/badge/License-MIT-purple.svg)](LICENSE)

## Install dependencies
## Set up environment

```bash
python -m venv .venv
.\.venv\Scripts\activate
```
poetry install
```

## Run REPL

Using poetry:
## Install dependencies

```
poetry run prolog [options] path
```bash
pip install -r requirements.txt
```

or
## Run REPL

```

```bash
python -m prolog.prolog [options] path
```

For example,

```
poetry run prolog tests/data/puzzle1.prolog
```bash
python -m prolog.prolog tests/data/puzzle1.prolog
```

Sample REPL session output:

```
poetry run prolog tests/data/myadven.prolog
```bash
python -m prolog.prolog tests/data/myadven.prolog

Welcome to Simple Prolog
ctrl-c to quit
> location(desk, office)
> location(desk, office).
yes
> location(desk, office1)
> location(desk, office1).
no
> location(X, Y)
> location(X, Y).
X = desk Y = office
X = apple Y = kitchen
X = flashlight Y = desk
Expand Down Expand Up @@ -197,7 +197,7 @@ yes
Linter:

```
poetry run flake8
python -m flake8
```

Tests:
Expand All @@ -206,6 +206,57 @@ Tests:
poetry run pytest --cov=prolog tests
```

## How to Use PyProlog as a Library

Install pyprolog:

```bash
pip install pyprolog
```

Here is an example how to use PyProlog as a library:

```python
from prolog import Scanner, Parser, Runtime


def main():
source = '''
location(computer, office).
location(knife, kitchen).
location(chair, office).
location(shoe, hall).
isoffice(X) :- location(computer, X), location(chair, X).
'''

tokens = Scanner(source).tokenize()
rules = Parser(tokens).parse_rules()

runtime = Runtime(rules)

goal_text = 'location(X, office).'

goal = Parser(Scanner(goal_text).tokenize()).parse_terms()

x = goal.args[0]

has_solution = False
for index, item in enumerate(runtime.execute(goal)):
has_solution = True
print(str(item))
print(str(goal.match(item).get(x)))

if has_solution:
print('Query has solution')
else:
print('Query has no solution')


if __name__ == "__main__":
main()
```

## Acknoledgments

This was inspired and based on this [article](https://curiosity-driven.org/prolog-interpreter)
Expand Down
Loading

0 comments on commit 0bb4f54

Please sign in to comment.