本文介绍在Linux系统下安装PySwip的方法,可安装在Arch Linux、Debian、Ubuntu、Fedora等系统中,同时还介绍使用PySwip的例子。
简介 PySwip是一个Python-SWI-Prolog桥,可在您的Python程序中查询SWI-Prolog。它具有一个SWI-Prolog外语接口,一个实用程序类,可以方便地使用Prolog进行查询,并且还具有Pythonic接口。 由于PySwip使用SWI-Prolog作为共享库和ctypes来访问它,因此不需要安装编译。 注:由于Python 2已经终止支持,所以PySwip 0.2.10是正式支持Python 2的最后一个版本(Python 2最后一个版本是Python 2.7.18:附Python-2.7.18.tgz下载)。
下载链接 PySwip下载地址:https://github.com/yuce/pyswip/releases
要求 1、Python 2.7或3.4及更高版本。目前不支持PyPy。 2、SWI-Prolog 7.2.x及更高版本。 3、libswipl作为共享库。这是大多数平台上的默认设置。 4、适用于Linux、Windows、MacOS和FreeBSD。
安装方法 PySwip除了Python的标准库外没有其他依赖项。某些操作系统未安装完整的标准库。在这种情况下,请确保您的Python设置包含ctypes。 我们建议将PySwip安装到虚拟环境中。Python3已经对此提供了内置支持。您可以使用以下方法在pyswip_env目录中创建虚拟环境: python3 -m venv pyswip_env 之后,您必须激活虚拟环境。在带有BASH/csh/tcsh shell的类UNIX平台(Linux、MacOS、FreeBSD等)上: source pyswip_env/bin/activate 重要信息:确保SWI-Prolog架构与Python架构相同。如果您使用的是64位版本的Python,请使用64位的SWI-Prolog等。 1、Arch Linux 使用以下命令安装具有依赖项的PySwip: sudo pacman -S python-pyswip 2、Debian、Ubuntu 安装SWI-Prolog: sudo apt install swi-prolog 如果您不想使用X绑定,只需使用swi-prolog-nox包。 如前所述安装并激活虚拟环境。 使用以下命令从Python软件包索引安装pyswip: pip install pyswip 通过在Python控制台上运行以下代码来运行快速测试: from pyswip import Prolog prolog = Prolog() prolog.assertz("father(michael,john)") 3、Manjaro Linux 安装: pamac install python-pyswip pacman -S python-pyswip 卸载: pamac remove python-pyswip pacman -R python-pyswip 4、Fedora 可使用以下命令安装具有依赖项的PySwip for Python 3: sudo dnf install python3-pyswip 可使用以下命令安装具有依赖项的PySwip for Python 2: sudo dnf install python3-pyswip
PySwip例子 1、使用Prolog from pyswip import Prolog prolog = Prolog() prolog.assertz("father(michael,john)") prolog.assertz("father(michael,gina)") list(prolog.query("father(michael,X)")) == [{'X': 'john'}, {'X': 'gina'}] for soln in prolog.query("father(X,Y)"): print(soln["X"], "is the father of", soln["Y"]) # michael is the father of john # michael is the father of gina 还可以查询和查询存储在Prolog文件中的现有知识库。假设文件名“knowledge_base.pl”和Python在同一工作目录中运行,则按如下方式进行查询: >>> from pyswip import Prolog >>> prolog = Prolog() >>> prolog.consult("knowledge_base.pl") 2、外部功能 from __future__ import print_function from pyswip import Prolog, registerForeign def hello(t): print("Hello,", t) hello.arity = 1 registerForeign(hello) prolog = Prolog() prolog.assertz("father(michael,john)") prolog.assertz("father(michael,gina)") print(list(prolog.query("father(michael,X), hello(X)"))) 3、Pythonic界面(实验性) from __future__ import print_function from pyswip import Functor, Variable, Query, call assertz = Functor("assertz", 1) father = Functor("father", 2) call(assertz(father("michael","john"))) call(assertz(father("michael","gina"))) X = Variable() q = Query(father("michael",X)) while q.nextSolution(): print("Hello,", X.value) q.closeQuery() # Outputs: # Hello, john # Hello, gina Prolog.query的核心功能基于Nathan Denny的公共域prolog.py。
相关主题 |