与swi prologs pengines交互的简单python库
pengines的Python项目详细描述
这是一个将python与prolog pengines接口的模块。 知识库。
API
创建一个基本的run pengine服务器脚本,并使用swipl运行它。
:- use_module(library(http/thread_httpd)). :- use_module(library(http/http_dispatch)). :- use_module(library(pengines)). server(Port) :- http_server(http_dispatch, [port(Port)]). :- server(4242).
初始化基本PengineBuilder
from pengines.Builder import PengineBuilder from pengines.Pengine import Pengine pengine_builder = PengineBuilder(urlserver="http://localhost:4242")
创建Pengine查询对象。
pengine = Pengine(builder=pengine_builder) pengine.create()
提出你的疑问-注意没有结束时间-彭宁表演 像“ask(成员(x,[1,2,3],[])”这样的查询。
query = "member(X, [1,2,3])" pengine.ask(query) print(pengine.currentQuery.availProofs)
重复下面的证明:
while pengine.currentQuery.hasMore: pengine.doNext(pengine.currentQuery) print(pengine.currentQuery.availProofs)
序言术语库
python库的序言旨在简化构造 prolog程序和python中的查询术语。
例如,如何将序言术语与pengines结合使用, 请参见:
https://pypi.org/project/prologterms/
from pengines.Builder import PengineBuilder from pengines.Pengine import Pengine from prologterms import TermGenerator, PrologRenderer, Program, Var P = TermGenerator() X = Var('X') Y = Var('Y') Z = Var('Z') R = PrologRenderer() p = Program( P.ancestor(X,Y) <= (P.parent(X,Z), P.ancestor(Z,Y)), P.ancestor(X,Y) <= P.parent(X,Y), P.parent('a','b'), P.parent('b','c'), P.parent('c','d') ) q = P.ancestor(X,Y) factory = PengineBuilder(urlserver="http://localhost:4242", srctext=R.render(p), ask=R.render(q)) pengine = Pengine(builder=factory, debug=True) while pengine.currentQuery.hasMore: pengine.doNext(pengine.currentQuery) for p in pengine.currentQuery.availProofs: print('{} <- {}'.format(p[X.name], p[Y.name]))