|
| 1 | +Python Pengines |
| 2 | +=============== |
| 3 | + |
| 4 | +This is a module for interfacing python with the Prolog Pengines |
| 5 | +knowledge base. |
| 6 | + |
| 7 | +API |
| 8 | +--- |
| 9 | + |
| 10 | +Create a basic run pengine server script, and run it with swipl. |
| 11 | + |
| 12 | +:: |
| 13 | + |
| 14 | + :- use_module(library(http/thread_httpd)). |
| 15 | + :- use_module(library(http/http_dispatch)). |
| 16 | + :- use_module(library(pengines)). |
| 17 | + |
| 18 | + server(Port) :- http_server(http_dispatch, [port(Port)]). |
| 19 | + |
| 20 | + :- server(4242). |
| 21 | + |
| 22 | +Initialize a basic PengineBuilder |
| 23 | + |
| 24 | +:: |
| 25 | + |
| 26 | + from pengines.Builder import PengineBuilder |
| 27 | + from pengines.Pengine import Pengine |
| 28 | + |
| 29 | + pengine_builder = PengineBuilder(urlserver="http://localhost:4242") |
| 30 | + |
| 31 | +Create the pengine querying object. |
| 32 | + |
| 33 | +:: |
| 34 | + |
| 35 | + pengine = Pengine(builder=pengine_builder) |
| 36 | + pengine.create() |
| 37 | + |
| 38 | +Make your query -- note the lack of ending period -- Pengine performs |
| 39 | +the query like 'ask(member(X, [1,2,3], [])).' |
| 40 | + |
| 41 | +:: |
| 42 | + |
| 43 | + query = "member(X, [1,2,3])" |
| 44 | + pengine.ask(query) |
| 45 | + print(pengine.currentQuery.availProofs) |
| 46 | + |
| 47 | +Iterate through the proofs like this: |
| 48 | + |
| 49 | +:: |
| 50 | + |
| 51 | + while pengine.currentQuery.hasMore: |
| 52 | + pengine.doNext(pengine.currentQuery) |
| 53 | + print(pengine.currentQuery.availProofs) |
| 54 | + |
| 55 | +prologterms library |
| 56 | +------------------- |
| 57 | + |
| 58 | +The python library prologterms aims to make it easier to construct |
| 59 | +prolog programs and query terms from within python. |
| 60 | + |
| 61 | +For an example of how to use prologterms in conjunction with pengines, |
| 62 | +see: |
| 63 | + |
| 64 | +https://pypi.org/project/prologterms/ |
| 65 | + |
| 66 | +:: |
| 67 | + |
| 68 | + from pengines.Builder import PengineBuilder |
| 69 | + from pengines.Pengine import Pengine |
| 70 | + from prologterms import TermGenerator, PrologRenderer, Program, Var |
| 71 | + |
| 72 | + P = TermGenerator() |
| 73 | + X = Var('X') |
| 74 | + Y = Var('Y') |
| 75 | + Z = Var('Z') |
| 76 | + R = PrologRenderer() |
| 77 | + |
| 78 | + p = Program( |
| 79 | + P.ancestor(X,Y) <= (P.parent(X,Z), P.ancestor(Z,Y)), |
| 80 | + P.ancestor(X,Y) <= P.parent(X,Y), |
| 81 | + P.parent('a','b'), |
| 82 | + P.parent('b','c'), |
| 83 | + P.parent('c','d') |
| 84 | + ) |
| 85 | + |
| 86 | + q = P.ancestor(X,Y) |
| 87 | + |
| 88 | + factory = PengineBuilder(urlserver="http://localhost:4242", |
| 89 | + srctext=R.render(p), |
| 90 | + ask=R.render(q)) |
| 91 | + pengine = Pengine(builder=factory, debug=True) |
| 92 | + while pengine.currentQuery.hasMore: |
| 93 | + pengine.doNext(pengine.currentQuery) |
| 94 | + for p in pengine.currentQuery.availProofs: |
| 95 | + print('{} <- {}'.format(p[X.name], p[Y.name])) |
0 commit comments