Pylo:几个Prolog引擎的Python前端

2020-10-21 00:07:47

Pylo是几个Prolog引擎的Python前端,它允许您只需切换后端,就可以编写一次程序并使用不同的Prolog引擎执行它。

GNU Prolog(到目前为止只能在OSX上运行;GNNU Prolog的外部函数接口在Linux上不能正确编译)。

步骤1:Pylo依赖ENV变量来检测要支持的Prolog引擎。需要首先安装所需的Prolog引擎。

要安装对GNU Prolog的支持,您需要提供指向GNU Prolog安装文件夹的GNUPROLOG_HOME变量:

要安装对XSB_PROLOG的支持,您需要提供指向XSB Prolog源代码的XSB_HOME变量。这是解压XSB源文件的文件夹。例如。

常见问题自述文件cmplib etc lib站点InstallXSB.jar管理配置示例软件包syglibLICENSE bin文档GPP prolog-commonsMakefile构建EMU安装程序prolog_include。

要安装对SWI Prolog的支持,您需要提供指向SWIPL安装文件夹的SWIPL_HOME变量。在OSX上,如下所示。

步骤2:克隆此存储库。您需要递归地提取它来获得子模块。

要安装GNU Prolog支持,您需要通过GNU_LIB_PATH提供GNU-Prolog安装文件夹的路径。例如,在OSX上使用默认安装会导致以下路径。

要安装对XSB Prolog的支持,您需要通过XSB_LIB_PATH提供外部接口库的路径。要找到此文件夹,假定<;XSB_ROOT>;包含解压XSB源代码的文件夹。

其中<;arch>;是系统的体系结构(它将是<;XSB_ROOT&>;/config文件夹中的唯一文件夹)。

要安装对SWI Prolog的支持,您需要通过SWIPL_LIB_PATH提供SWIPL库的路径。要查找正确的文件夹,请在SWIPL安装文件夹中查找lib/<;Arch&>文件夹(<;Arch&>是您的系统的体系结构)。例如,在OSX上,EVN var应如下所示。

步骤2:设置环境变量后,可以使用以下命令安装Pylo(和所需的Prolog引擎。

重要提示:由于编译选项不兼容,您不能同时指定所有三个选项。如果要构建对多个Prolog引擎的支持,则必须分别编译引擎(当时仅指定一个标志)。

步骤3:编译完成后,确保可以通过PATH和PYTHONPATH变量访问Build文件夹。

为了使用SWIPL,您需要使用LD_LIBRARY_PATH环境变量提供动态库的路径。例如,在OSX上

对于Ciao Prolog,您还需要能够找到动态库。关于OSX。

为了降低内存使用量,常量、变量、函数器和谓词需要通过上下文进行构造:

如果您希望在子句中使用命题(不带参数的函数器),如:-...,请将其创建为带编号0的谓词。请小心使用文字而不是结构来构建子句。

Pylo允许您方便地指定知识库并使用不同的PROLOG引擎进行查询。所有基本结构(常量、变量、函数器和谓词)都应该使用全局上下文(函数以c_:c_const、c_pred、c_var、c_functor为前缀)创建,这样可以确保不会出现重复。

从Pylo import c_pred,c_var,c_const,c_functor,Atom,Clause,Conj,Structure,List#创建一些常量Luke=c_const(";Luke";)Anakin=c_const(";Anakin";)leia=c_const(";leia";)padme=c_const(";padme";)#create谓词父=c_pred(";padme";)。,2)MASTER=c_pred(";MASTER";,2)Parent=c_PRED(";Parent";,2)#创建文字f1=Atom(父亲,[阿纳金,卢克])f2=Atom(父亲,[阿纳金,莱娅])f3=Atom(母亲,[帕德梅,卢克])f4=Atom(母亲,[帕德梅,莱娅])#创建变量X=c_var(";X";)Y=c_var(";Y";)#CREATE子句Head=Atom(Parent,[X,Y])Body1=Atom(Parent,[X,Y])Body2=Atom(Move,[X,Y])rule1=Clause(Head,Conj(Body1))rule2=Clause(Head,Conj(Body2))#Create Structures sabre=c_const(";sabre";)green=c_const(";green";)Item=c_functor(";Item";)struct=Structure(Item,[sabre,green])#创建列表l=list([padme,leia,1,2,3])。

这种显式的面向对象的方法可能适合于程序的自动构建,Pylo还为知识库的构建提供了许多方便快捷的方式,上面的例子可以用下面的方式来构建。

从Pylo导入c_pred、c_const、c_var、c_functor,列表#构造谓词父项=c_pred(";父项";,2)母项=c_pred(";母亲";,2)父项=c_pred(";父项";,2)CLOSES_TO=c_PRED(";CLOSES_TO";,2)#直接创建事实#将谓词符号应用于术语/字符串创建文字#它还会将字符串转换为适当的结构f1=父亲(";阿纳金";,";卢克";)f2=父亲(";阿纳金";,";莱娅";)f3=母亲(";padme";,";卢克";)f4=母亲(";padme";,";Leia";))#直接创建结构#将函数器应用于一系列术语/字符串创建一个结构#它还知道如何将字符串转换为正确的格式Item=c_functor(";Item";,2)struct=Item(";sabre";,";green";)f5=Beles_to(struct,";Luke";)#create list l=list([";padme";,";leia";)#create list l=list([";padme";,";leia";)#create list l=list([";padme";,";leia";,1,2,3])#如果常量是数字,只需使用Python数据结构#Creating子句Rule 1=Parent(";X";,";Y";)<;=Parent(";X";,";Y";)rule2=Parent(";X";,";Y";)<;=母亲(";X";,";Y";)。Y";)。

从皮洛寄来的。引擎从Pylo导入SWIProlog。引擎从Pylo导入XSBProlog。引擎导入GNUProlog#create GNU Prolog实例pl_gnu=GNUProlog()#create XSB Prolog#您需要提供路径pl_xsb=XSBProlog(";[安装中使用的XSB文件夹的路径]";)#create SWI Prolog#如果对应于pl_Swi=SWIProlog(';/usr/local/bin/swpl';),则SWIPL二进制文件的路径是可选的。

SWIProlog将可执行文件的路径作为参数。如果路径是标准路径,即OSX上的路径为/usr/local/bin/swpl,则不需要传递任何参数。

From pylo import prolog pl=prolog()#查询文件pl。Consult(";metagol.pl";)#load module#Pylo不提供跨不同引擎的模块的标准化#这意味着确保提供正确的模块名称是您的工作##例如,GNU Prolog没有模块#XSB Prolog需要指定要从库中加载哪些谓词,#这是作为额外的名称参数提供的,它接受谓词pl的列表。Use_module(";library(List)";)#断言事实或子句pl。Asserta()#断言事实或子句pl。Assertz()#撤销文字pl。Retract()#检查是否可能满足查询#HAS_Solution(...)。可以将任意数量的文字作为参数,该参数被解释为连接词pl。HAS_Solution()#查询所有解决方案#query(...)。接受任意数量的文字作为输入,它被解释为conjucion#它另外还接受';max_Solutions';参数,该参数可用于限制查找pl的解的数量。查询()。

从皮洛寄来的。引擎从Pylo导入XSBProlog导入c_pred pl=XSBProlog(";/Users/Seb/Documents/Programs/XSB&34;)Person=c_pred(";Person";,1)Friends=c_pred(";Friends";,2)Stress=c_pred(";Stress";,1)Imffects=c_pred(";Influence";,2)Smokes=c_pred(";Smokes";;,1)哮喘=c_pred(";哮喘";,1)pl.。Assertz(人(";a";))pl.。Assertz(Person(";b";))pl.。Assertz(Person(";c";))pl.。Assertz(Friends(";a";,";b";))pl.。Assertz(Friends(";a";,";c";))pl.。Assertz(Stress(";X";)<;=Person(";X";))pl.。Assertz(影响(";X&34;,";Y&34;)<;=Person(";X&34;)&;Person(";Y";))pl.。Assertz(Smokes(";X";)<;=Stress(";X";))pl.。Assertz(Smokes(";X&34;)<;=Friends(";X&34;,";Y&34;)&;Influents(";Y";,";X&34;)&;Smokes(";Y";))pl.。Assertz(哮喘(";X&34;)<;=吸烟(";X&34;))query_p=Person(";X";)TV=pl.。Query(Query_P)打印(";所有人:";,tv)query_f=Friends(";X";,";Y";)tv=pl.。Query(Query_F)print(";all Friends:";,tv)query_st=stress(";Y";)tv=pl.。Query(Query_St)打印(";所有有压力的人:";,tv)tv=pl。查询(影响(";X";,";Y";))打印(";所有影响:";,TV)TV=pl.。查询(Smokes(";X";))打印(";所有吸烟者:";,TV)TV=pl.。查询(哮喘(";X";),max_Solutions=3)打印(";所有哮喘:";,TV)