数据简化DataSimp导读:在自然语言处理、知识工程和知识简化中,我们通过知识库来处理某些概念和实体关系,其中常用到递归。本文简单举例java递归和prolog最简单的递归编程代码。然后介绍统一化逻辑编程的高级计算机语言Prolog官网特征。下期继续介绍逻辑推理涉及到的基础概念,如逻辑学、逻辑推理、递归、递推、循环、迭代、遍历等;介绍其编程开发语言中的相应代码。
知识库递归编程java和prolog代码;逻辑语言Prolog简介(24555字)
目录
A逻辑学形式化及递归的prolog编程(4860字)
1.逻辑学形式化方法简介
2.SWI-Prolog的递归
B逻辑编程语言Prolog简介(18718字)
1.SWI-Prolog
2.Prolog
参考文献(1227字)
逻辑学形式化及递归的prolog编程
文|秦陇纪,数据简化DataSimp20190126Sat
逻辑学是研究思维的学科。思维有内容和形式两个方面。思维内容指思维所反映的对象及其属性;思维形式指用以反映对象及其属性的不同方式,即表达思维内容的不同方式。形式性上思维分:感性具象思维(感官感觉到的具体)、抽象逻辑思维(抽象概念为形式)、理性具象思维。从逻辑学角度看,抽象思维的三种基本形式是概念、命题和推理。逻辑和逻辑学的发展,经过了具象逻辑、抽象逻辑、对称逻辑(具象与抽象相统一)三大阶段。
1.1形式化方法(formalmethods)
形式化方法(formalmethods)在逻辑科学中是指分析、研究思维形式结构的方法。它把各种具有不同内容的思维形式(主要是命题和推理)加以比较,找出其中各个部分相互联结的方式,如命题中包含概念彼此间的联结,推理中则是各个命题之间的联结,抽取出它们共同的形式结构;再引入表达形式结构的符号语言,用符号与符号之间的联系表达命题或推理的形式结构。
例如,把全称肯定命题,用符号形式化为“SAP”;把联言命题、假言命题分别形式化为:“p∧q、“p→q”。
又例如:一个具体的假言联言推理“如果这种金属是纯铝,那么它的物理性质必与纯铝相同;如果这种金属是纯铝,那么它的化学性质必与纯铝相同;但这种金属的物理性质和化学性质与纯铝不相同;所以,它不是纯铝。”
这个推理的形式结构是:“如果p,则q;如果p,则r;非q且非r;所以非p。”
可进而形式化为下列公式:((p→q)∧(p→r)∧┐q∧┐r→┐p。
从古至今,中国人的通病是不关心“推理”的内在意义,即其形式化逻辑的严谨性,而是按照名人名言做所谓的“语文引用推理”,极其幼稚肤浅。随着信息时代的发展,推理的意义逐渐地被扩大化,随意的语文滥用使其词义模糊、更加不严谨。推理的学术含义,即学术推理,来自于这个词的根本——它是理性世界的产物,是极符合科学的一种象征,不带一丝幻想,不带一点艺术感。它所要求的极严密的逻辑性,被学者们奉为是带动世界发展最有利的手段,是科学理论、哲学理论的基石。
描述逻辑是一种知识表示的形式化语言,是一阶逻辑的可判定子集。是否采用形式化方法,这是存在于广义语言逻辑与狭义语言逻辑之间的激烈论争。采用近世代数和时序逻辑的方法定义了形式化描述语言,并形式化地描述了密码协议的分层安全需求。
Deionlogicisaformallanguageforrepresentingknowledgeanditisadecidablesubsetoffirst-orderlogic.Thereisaheateddisputebetweenthelogicoflanguageinbroadsenseandtheoneinnarrowsenseontheapplicationofthemethodofformalization.Usingtemporallogicandalgebra,aformalrequirementlanguagewaspresentedandusedtodescribetheformalhierarchyrequirementsforcryptographicprotocols.
在思维推理过程中,常见演绎推理(DeductiveReasoning)、归纳推理(InductiveReasoning)和类比推理(Analogy)等。但在可计算算法设计中,常见的却是表示“重复”含义的词,如循环(loop)、递归(recursion)、遍历(traversal)、迭代(iterate)等。我们来看一下循环等形式化描述的概念及其算法实现。
1.2递归和递推概念
计算机中,凡是重复执行一段代码,都可以称之为循环。大部分递归、遍历、迭代、都是循环。递归就是根据一种(几种)基本情况定义的算法,其他复杂情况都可以被逐步还原为基本情况。在编程中的特征就是,在函数定义内重复调用该函数。
递归:从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为递归。
递推:递推算法是一种用若干步可重复运算来描述复杂问题的方法。递推是序列计算中的一种常用算法。通常是通过计算机前面的一些项来得出序列中的指定象的值。
遍历:按一定规则访问一个非线性的结构中的每一项,强调非线性结构(树、图)。
迭代:一般适用于线性结构(数组、队列)。
1.3递归的java算法设计
1.3.1算法举例1
斐波那契数列:已知f(1)=1,f(2)=1,且满足关系式f(n)=f(n-1)+f(n-2),则f(50)等于多少?
分析:根据初始条件f(1)=1,f(2)=1和关系式f(n)=f(n-1)+f(n-2),可知,f(3)=f(2)+f(1),f(3)=f(2)+f(1)…….
编写代码(递归)
publicclassFibonacci{
staticintfun(intn){
if(n==1||n==2){
return1;
}else{
returnfun(n-1)+fun(n-2);
}
publicstaticvoidmain(String[]args){
for(inti=1;i<=15;++i)
System.out.println(fun(i));
编写代码(递推)
staticintfun2(intn){
inta[]=newint[20];
a[1]=1;
a[2]=1;
for(inti=3;i<=n;i++){
a[i]=a[i-1]+a[i-2];
returna[n];
运行结果:
1
2
3
5
8
13
21
34
55
89
144
233
377
610
1.3.2算法举例2
使用递归计算1+2+…+100;
分析:递归关系为f(n)=f(n-1)+n,递归出口为f(1)=1;
编写代码(递归):
publicclassSum{
if(n==1){
returnfun(n-1)+n;
//TODOAuto-generatedmethodstub
System.out.println(fun(100));
inta[]=newint[200];
for(inti=2;i<=n;i++){
a[i]=a[i-1]+i;
5050
1.3.3算法举例3
爬楼问题:假设有n阶楼梯,每次可爬1阶或2阶,则爬到第n层有几种方案?
问题分析:假设一阶时只有一种方案f(1)=1;二阶时有两种方案(即一次走一阶和一次走两阶)f(2)=2;三阶时有3种f(3)=3;四阶时有五种f(5)=5;发现递归规律f(n)=f(n-1)+f(n-2);递归出口为f(1)=1、f(2)=2;
publicclassLadder{
}elseif(n==2){
return2;
System.out.println(fun(5));
编写代码(递推):
a[2]=2;
图1:分步阅读
2.1牛刀小试——寻找祖先和后代的程序
安装好SWI-Prolog。我们先从这一个简单的例子来了解递归的性质吧。
在ancestor子句中的一个子句会使用ancestor子句。在这个例子中,ancestor(Z,Y)是一个递归的子目标。father是实现递归子目标的核心事实。规则ancestor/2有两个子句。
如果一个规则由多个子句组成,那么其中一个子句为真,则这个规则为真。可以把子句间的逗号看成是条件“与”的关系,把子句之间的句号看成是条件“或”的关系。
我们可以测试一下这个规则:
我们首先询问命题ancestor(john_boy_sr,john_boy_jr).和ancestor(zeb,john_boy_jr).是否为真,接着给出变量Who,分别寻找zeb的后代和john_boy_jr的祖先。
我们已经可以在知识库中使用这个规则实现两个目的:寻找祖先和后代。
2.2渐入佳境——利用递归计算阶乘
一个整数的阶乘定义为,该数与小于它的全部正整数的积,一个整型数的阶乘用该数及后面的感叹号表示(!)。比如:5!=5×4×3×2×1。一般形式为:
n!=n×(n-1)×(n-2)×……×3×2×1
然而,一个整型数的阶乘还可能表示为这个整型数与公比其小1的那个整型数的阶乘的乘积,例如:5!=5×4!。这种阶乘的定义方式就体现了递归,因为它利用阶乘自定义阶乘。因此,任一正整数的阶乘可用下面递归定义给出:
n!=n×(n-1)!
在数学的定义上,0的阶乘等于1。因此,阶乘的完整定义如下:
0!=1(停止条件)
n!=nx(n-1)!(递归定义)
转换成Prolog程序如下图所示:
在询问后,得到结果后按回车。运行结果如图所示。值得注意的是,在知识库中停止条件应该放在递归规则前面,这一点是至关重要的。因为如果不是这样,停止条件将永远不会满足。假如把规则放在停止条件前面,那么Prolog重复进入知识库时将首先遇到它,并与其进行匹配,即使是应满足停止条件时,也绝不会与停止条件匹配,从而引起无穷递归。
2.3趁热打铁——斐波那契数列
数学的斐波那契数列是一个正整数数列,它与黄金比例有着密切的联系。该数列的下一个数是由其前面两个数相加得到的,头两个数均为1。该数列如下:
1,1,2,3,5,8,13,21,34,55,……
通式为:
f(1)=1(两个停止条件)
f(2)=1
f(n)=f(n-1)+f(n-2)(递归规则)
这里用Num1、Num2这两个变量分别来表示序数Num项的前面两项;变量Term1和Term2分别表示前两项斐波那契数的结果。来转换成Prolog程序如下图所示:
运行后的结果如下图所示。从截图可以看出,这些递归的程序还存在一些问题,比如在已经得出结果后,如果按“;”键试图查找另一个解时,会出现错误的答案,甚至开始报错。因为如果查找另一个结果,会重新进入递归条件,会再次减去数字,因而会报错。我将会在下次介绍Prolog的另一个机制——截断。
2.4总结
以上几个实例用于说明递归的Prolog程序。大多数较大的Prolog程序都可能包含递归,递归是大多数Prolog程序中的主要控制手段。
在编写递归程序时,应牢记下述几点:
所有递归规则都必须有停止条件,如果没有停止条件,递归规则将无止境地递归下去。
一般情况下,停止条件应该放在知识库中递归规则的上方。因为如果总找不到停止条件,也将导致无穷递归。
通常,在编写Prolog程序时应尽量采用递归,这要求自问如下问题:
是否可以把问题用其自身表达出来?
停止条件是什么?
总的来说,递归规则具有下列一般形式:
递归规则的停止条件.
递归谓词:-
某些初始计算,
递归谓词,
某些最终运算.
(注1:资料来自百度、CSDN等[4-6]。)
逻辑编程语言Prolog简介
文|swi-prolog.org,译|秦陇纪,数据简化DataSimp20190126Sat
News:SWI-PrologonAndroidTermuxSearchDocumentation:
Robust,mature,free.Prologfortherealworld.
Home/DOWNLOAD/DOCUMENTATION/TUTORIALS/COMMUNITY/USERS/WIKI
SWI-Prolog提供全面的免费Prolog环境。自1987年成立以来,SWI-Prolog开发一直受到现实世界应用需求的驱动。SWI-Prolog广泛用于研究和教育以及商业应用。加入已下载SWI-Prolog的超过一百万用户。更多...
SWI-PrologoffersacomprehensivefreePrologenvironment.Sinceitsstartin1987,SWI-Prologdevelopmenthasbeendrivenbytheneedsofrealworldapplications.SWI-Prologiswidelyusedinresearchandeducationaswellascommercialapplications.JoinoveramillionuserswhohavedownloadedSWI-Prolog.more...
DownloadSWI-Prolog
GetStarted
TrySWI-Prologonline
SEARCHDOCUMENTATION:PoweredbySWI-Prolog8.1.0-47-gc355e37
News:SWI-PrologClass!SearchDocumentation:
1.1概述Overview
SWI-Prolog是Prolog语言的多功能实现。尽管SWI-Prolog主要在教育领域受到欢迎,但其发展主要受应用程序开发需求的驱动,通过支持许多文档类型和(网络)协议以及与C的全面低级接口(其为C++,Java(捆绑),C#,Python等(外部可用)的高级接口的基础)等与其他IT组件的丰富接口促进。数据类型扩展(如dicts和strings)以及对Unicode和无界整数的完全支持简化了与其他组件数据的平滑交换。
SWI-Prolog旨在实现可扩展性。它对多线程的强大支持有效地利用了多核硬件,并简化了并发应用程序中的嵌入。它的即时索引(JITI)为具有数百万个子句的谓词提供透明和有效的支持。
SWI-Prolog统一了Prolog社区中开发的核心语言的许多扩展,例如表格、约束、全局变量、破坏性赋值、分隔连续和交互者。
SWI-Prolog提供各种开发工具,其中大部分可以随意组合。本机系统提供了一个用Prolog编写的编辑器,它是Emacs的相似克隆。它基于Prolog系统本身对代码的实时分析提供语义突出显示。补充工具包括图形调试器、分析器和交叉引用器。或者,有一种GNU-Emacs模式,Eclipse插件称为PDT和VSC插件,每种插件都可以与本机图形工具结合使用。最后,SWISH提供了一个计算笔记本和基于Web的IDE。SWISH是一种多功能工具,可以配置和扩展以适应许多不同的场景。
SWI-Prolog提供了一个名为包的附加分发和安装机制。包是具有最小组织约定的目录,和描述源、版本、依赖性和自动升级支持的控制文件。可以使用pack_install/1包从存档,GIT仓库或URL安装包。包用于在社区中共享代码。包装系统已经发展了几个生态系统,用于处理类型,协同处理等。
SWI-PrologisaversatileimplementationoftheProloglanguage.AlthoughSWI-Prologgaineditspopularityprimarilyineducation,itsdevelopmentismostlydrivenbytheneedsforapplicationdevelopment.ThisisfacilitatedbyarichinterfacetootherITcomponentsbysupportingmanydocumenttypesand(network)protocolsaswellasacomprehensivelow-levelinterfacetoCthatisthebasisforhigh-levelinterfacestoC++,Java(bundled),C#,Python,etc(externallyavailable).DatatypeextensionssuchasdictsandstringsaswellasfullsupportforUnicodeandunboundedintegerssimplifysmoothexchangeofdatawithothercomponents.
SWI-Prologaimsatscalability.Itsrobustsupportformulti-threadingexploitsmulti-corehardwareefficientlyandsimplifiesembeddinginconcurrentapplications.ItsJustInTimeIndexing(JITI)providestransparentandefficientsupportforpredicateswithmillionsofclauses.
SWI-PrologunifiesmanyextensionsofthecorelanguagethathavebeendevelopedinthePrologcommunitysuchastabling,constraints,globalvariables,destructiveassignment,delimitedcontinationsandinteractors.
SWI-Prologoffersavarietyofdevelopmenttools,mostofwhichmaybecombinedatwill.ThenativesystemprovidesaneditorwritteninPrologthatisaclosecloneofEmacs.ItprovidessemantichighlightingbasedonrealtimeanalysisofthecodebythePrologsystemitself.Complementarytoolsincludeagraphicaldebugger,profilerandcross-referencer.Alternatively,thereisamodeforGNU-Emacsand,EclipseplugincalledPDTandaVSCplugin,eachofwhichmaybecombinedwiththenativegraphicaltools.Finally,acomputationalnotebookandwebbasedIDEisprovidedbySWISH.SWISHisaversatiletoolthatcanbeconfiguredandextendedtosuitmanydifferentscenarios.
SWI-Prologprovidesanadd-ondistributionandinstallationmechanismcalledpacks.Apackisadirectorywithminimalorganizationalconventionsandacontrolfilethatdescribestheorigin,version,dependenciesandautomaticupgradesupport.Packscanbeinstalledfromanarchive,GITrepositoryorURLusingpack_install/1.Packsareusedtosharecodeinthecommunity.Thepacksystemhasgrownacoupleofecosystemsfordealingwithtypes,coroutining,etc.
1.2服务器应用Serverapplications
SWI-Prolog配备了广泛的Web服务器(HTTP)框架,可用于提供(REST)服务和基于HTML5+CSS+Java的最终用户应用程序。Pengines(Prolog引擎)允许客户端使用通用API对远程服务器上的客户端提供的程序运行查询。这些程序可以在沙箱中执行。
对于(Web)服务器支持,SWI-Prolog提供可扩展多线程。我们在128核心power系统上测量了80倍加速运行。此功能使SWI-Prolog对CPU密集型服务器任务具有吸引力,其中多个客户端需要访问大型共享和可能的动态数据集。请注意,许多其他高级语言(如Python和Node.js)仅使用单个核心,并基于阻止I/O在任务之间切换。这种方法通常为具有大量连接的I/O密集型服务提供良好的资源使用,但是计算上的任务阻塞会延迟所有其他客户端。由于SWI-Prolog的全局垃圾收集器_用于原子和移除的动态子句在专用线程中完全异步运行,因此其(软)实时行为非常出色。
SWI-Prolog具有几个独特的功能,可以减少重启服务器以修复错误或注入诊断代码的需要。它的增量编译与通常的本地和可回溯数据结构(撤消)相结合,允许在不重新启动的情况下修补程序。SWI-Prolog允许安全地从另一个线程重新加载运行代码,前提是运行谓词的签名不会更改。这意味着允许添加,删除和修改子句,但不允许添加,删除或重新排序参数。但是,此功能对于热修复服务器或将诊断代码注入服务器而不重新启动非常有用。
SWI-Prologisequippedwithanextensivewebserver(HTTP)frameworkthatcanbeusedbothforproviding(REST)servicesandend-userapplicationsbasedonHTML5+CSS+Java.Pengines(Prologengines)allowclientstorunqueriesagainstaclient-providedprogramonaremoteserverusingagenericAPI.Suchprogramscanbeexecutedinasandbox.
For(web)serversupportSWI-Prologprovidesscalablemultithreading.Wemeasuredan80timesspeeduprunningona128corepowerpcsystem.ThisfeaturemakesSWI-PrologattractiveforCPUintensiveservertaskswheremultipleclientsrequireaccesstoalargesharedandpossiblydynamicdataset.Notethatmanyotherhigh-levellanguagessuchasPythonandNode.jsonlyuseasinglecoreandswitchbetweentasksbasedonblockingI/O.ThisapproachgenerallyprovidesgoodresourceusageforI/Ointensiveserviceswithahighnumberofconnectionsbutataskblockingonacomputationdelaysallotherclients.AsSWI-Prolog'sglobalgarbagecollectors_foratomsandremoveddynamicclausesrunfullyasynchronousinadedicatedthread,its(soft)realtimebehaviourisexcellent.
SWI-Prologhasseveraluniquefeaturesthatreducetheneedtorestartserversforfixingbugsorinjectingdiagnosticcode.Itsincrementalcompilationcombinedwithgenerallylocalandbacktrackabledatastructures(undo)allowsforpatchingtheprogramwithoutrestarting.SWI-Prologallowsforreloadingrunningcodefromanotherthreadsafely,providedthesignatureoftherunningpredicatesisnotchanged.Thisimpliesitisallowedtoadd,removeandmodifyclausesbutitisnotallowedtoadd,removeorreorderarguments.Still,thisfeatureisvaluableforhot-fixingserversorinjectdiagnosticcodetoaserverwithoutrestarting.
1.3Prolog作为统一语言Prologasunifyinglanguage
虽然Prolog被广泛认为是规则评估等任务的特殊用途语言,但我们认为它主要是一个适合用作各种组件间粘合的平台。其主要原因是数据是许多现代应用程序的核心,而数据的结构和存储种类繁多。诸如SQL,SPARQL,XPATH等经典查询语言只能处理一种这样的格式,而Prolog可以为这些格式提供简洁自然的查询语言,这些格式既可以直接执行,也可以编译成专用的查询语言表达式。Prolog的关系范式非常适合表格数据(RDBMS),而对递归代码的优化支持非常适合树形图形数据(RDF)。
Prolog是域特定语言(DSL)的合适语言。SWI-Prolog通过Prolog语言的语法扩展改进了这种支持。可以明确处理的有效语法的示例是[1][2],point{x:1,y:1}和function()。此外,准引用允许与任意语言的语法进行安全和清晰的集成。例如,以下语句指定了Prolog值X的安全插值的Java片段。
{|java(X)||varx=X;|}
AlthoughPrologiswidelyrecognisedasaspecialpurposelanguagefortaskssuchasruleevaluationweconsideritprimarilyaplatformthatissuitabletobeusedasgluebetweenvariouscomponents.Themainreasonforthisisthatdataisatthecoreofmanymodernapplicationswhilethereisalargevarietyinwhichdataisstructuredandstored.ClassicalquerylanguagessuchasSQL,SPARQL,XPATH,etc.caneachdealwithonesuchformatonly,whilePrologcanprovideaconciseandnaturalquerylanguageforeachoftheseformatsthatcaneitherbeexecuteddirectlyorbecompiledintodedicatedquerylanguageexpressions.Prolog'srelationalparadigmfitswellwithtabulardata(RDBMS),whileoptimizedsupportforrecursivecodefitswellwithtreeandgraphshapeddata(RDF).
PrologisasuitablelanguageforDomainSpecificLanguages(DSL).SWI-ProloghasimprovedthissupportbysyntacticalextensionstotheProloglanguage.Examplesofvalidsyntaxthatcanbeprocessedunambiguouslyarea[1][2],point{x:1,y:1}andfunction().Inaddition,quasiquotationsallowforsafeandcleanintegrationwiththesyntaxofarbitrarylanguages.Forexample,thefollowingstatementspecifiesafragmentofJavawithasafeinterpolationofthePrologvalueX.
1.4功能列表Featurelist
BelowisalistofwhatweconsiderkeyfeaturesofSWI-Prologwithlinkstotherelevantdocumentation.
1.4.1引擎Engine
快速编译。例如,在14秒内从Prolog源加载WordNet3.0或从快速加载文件格式加载0.4秒(参见qcompile/1)。WordNet源计数为821,515行。系统:Inteli7-3770上的Ubuntu16.04,32Gb内存。
强大且无内存泄漏。用于多个24x7运行的服务器(包括此Web服务)。
小。完整的开发环境,包括图形,库和许多接口包,需要大约100MB的硬盘。内核大约是1.4MB(Ubuntu16.04.so文件)
适用于大型应用程序。程序大小,原子长度,术语arity或整数值没有限制。具有许多(索引)事实的谓词没有性能下降。
对任何参数的静态和动态代码进行即时索引,大大简化了处理多模式关系的条款。从7.5版开始,支持多参数JITI。如果没有选择性单参数索引,这将为两个参数的组合值创建索引。从版本7.7开始,我们还支持对复合术语的参数进行索引。此功能显着提高了语法规则(DCG)中处理终端的性能。
基于GMP库的无界整数和有理数运算。
好东西:模块(向上兼容Quintus和SICStus),垃圾收集(对C/C++透明-代码,包括原子和子句垃圾收集),最后调用优化,运行时堆栈的动态扩展,异常处理(包括用于捕获和抛出异常的C/C++接口)。
归因变量,coroutining(冻结/2,当/2,dif/2),全局变量,循环项。
标志控制的发生检查处理(假/真/错误)请参见current_prolog_flag/2。发生检查的有效实现仅检验新绑定不引入循环。
内部UNICODE字符集处理。适用于网络和国际应用。
多线程支持:在同一数据库上运行多个预先安排好的prolog引擎。
引擎,也称为交互器,提供协同程序,可用于状态累积和大规模并发,例如群体智能和模拟。
定界延续是新控制结构和实现方面编程的强大构建块。
·fastcompilation.E.g.,loadsWordNet3.0in14secondsfromthePrologsourceor0.4secondsfromquickloadfileformat(seeqcompile/1).TheWordNetsourcecounts821,515lines.System:Ubuntu16.04onInteli7-3770,32Gbmemory.
·Robustandfreeofmemoryleaks.Inuseforseveralserversthatrun24x7(includingthiswebservice).
·Small.Thefulldevelopmentenvironment,includinggraphics,librariesandmanyinterfacepackages,requiresapproximately100MBharddisk.Thekernelisabout1.4MB(Ubuntu16.04.sofile)
·Scaleswellforlargeapplications.Nolimitsonprogramsize,atomlength,termarityorintegervalues.Noperformancedegradationonpredicateswithmany(indexed)facts.
·Just-In-Timeindexingofbothstaticanddynamiccodeonanyargumentgreatlysimplifieshandlingmulti-modedrelationswithmanyclauses.Asofversion7.5,multi-argumentJITIissupported.Thiscreatesanindexforthecombinedvalueoftwoargumentsifthereisnoselectivesingle-argumentindex.Asofversion7.7wealsosupportindexingontheargumentsofcompoundterms.Thisfeaturenotablyimprovestheperformanceforhandlingterminalsingrammarrules(DCGs).
·UnboundedintegerandrationalnumberarithmeticbasedonGMPlibrary.
·Thegoodies:modules(upwardcompatibletoQuintusandSICStus),garbage-collection(transparenttoC/C++-code,includingatomandclausegarbagecollection),last-calloptimisation,dynamicexpansionoftheruntimestacks,exception-handling(includingC/C++interfaceforbothcatchingandthrowingexceptions).
·attributedvariables,coroutining(freeze/2,when/2,dif/2),globalvariables,cyclicterms.
·Flag-controlledhandlingofoccurs-check(false/true/error)seecurrent_prolog_flag/2.Efficientimplementationofoccurscheckingthatonlyverifiesthatnewbindingsdonotintroducecycles.
·UNICODEcharactersethandlinginternal.Idealforwebandinternationalapplications.
·Multi-threadingsupport:runmultiplepre-emptivelyscheduledprologenginesonthesamedatabase.
·Engines,alsoknownasinteractorsprovidecoroutinesthatcanbeusedforstateaccumulationandmassiveconcurrencyfore.g.,swarmintelligenceandsimulations.
·Delimitedcontinuationsisapowerfulbuildingblockfornewcontrolstructuresandrealiseaspectprogramming.
·Tabling(SLGresolution)providesamorerobustresolutiontechniqueforsolvingqueriesovercomplexinterrelatedruleswithguaranteedtermination.
1.4.2约束处理Constrainthandling
·CHR(约束处理规则),clp(FD),clp(R,Q)和其他各种库。
·LibrariesforCHR(ConstraintHandlingRules),clp(FD),clp(R,Q)andvariousothers.
1.4.3连通性Connectivity
SWI-Prolog为HTTP提供广泛的客户端和服务器库。HTTP服务器框架处理生成HTML,交换JSON或XML,身份验证,会话等等。客户端和服务器都支持HTTPS。
灵活快速的C语言和C++语言接口。该接口允许双向调用,双向处理非确定性以及在C/C++项目中嵌入SWI-Prolog内核。
可以使用JPL,Python和C#等高级语言(如Java)的接口。
ODBC接口提供数据库连接。
低级网络支持包括套接字(TCP和UDP),SSL和TIPC。
用于解析和生成SGML/XML/HTML,JSON和YAML的库
关联数据(RDF)支持包括读写许多RDF格式(RDF/XML,Turtle,Ntriples,NQuads)和高效的三重存储。请参阅semweb包。
·SWI-PrologprovidesextensiveclientandserverlibrariesforHTTP.TheHTTPserverframeworkdealswithgeneratingHTML,exchangeofJSONorXML,authentication,sessions,andmuchmore.BothclientandserversupportsHTTPS.
·FlexibleandfastinterfacetotheC-andC++-language.Theinterfaceallowsforcallingbothways,handlingofnon-determinismbothwaysandembeddingoftheSWI-PrologkernelinC/C++projects.
·InterfacestohighlevellanguagessuchasJavausingJPL,PythonandC#areavailable.
·DatabaseconnectivityisprovidedbytheODBCinterface.
·Lowlevelnetworksupportincludessockets(bothTCPandUDP),SSLandTIPC.
·LibrariesforparsingandgeneratingSGML/XML/HTML,JSONandYAML
·LinkedData(RDF)supportincludesreadingandwritingmanyRDFformats(RDF/XML,Turtle,Ntriples,NQuads)andanefficienttriplestore.Seethesemwebpackage.
1.4.4开发工具Developmenttools
通过XPCE(Windows,Unix/Linux,MacOSX)支持图形的所有平台上的源级调试器。
交叉参考。gxref/0为可扩展的Prolog交叉引用器(外部参照)提供了图形前端。
通过PlDoc识别编程支持。提供手册和应用程序文档的集成视图,并为您的应用程序生成LaTeX文档。
通过PlUnit进行单元测试支持。
SWISH提供了一个基于Web的平台,用于在协作环境中开发和运行Prolog代码。
·Source-leveldebuggeronallplatformsthatsupportsgraphicsthroughXPCE(Windows,Unix/Linux,MacOSX).
·Executionprofiler(timeandcallstatistics)forallmajorplatforms(Windows,Linux,MacOSX).
·Cross-Referencer.gxref/0providesagraphicalfront-endfortheextensiblePrologcross-referencer(xref).
·LiterateprogrammingsupportthroughPlDoc.ProvidesintegratedviewonmanualandapplicationdocumentationandproducingLaTeXdocumentationforyourapplication.
·UnittestingsupportthroughPlUnit.
·SWISHprovidesaweb-basedplatformfordevelopingandrunningPrologcodeinacollaborativeenvironment.
1.4.5兼容性Compatibility
全面的内置谓词集,涵盖ISO标准的第1部分,事实上的爱丁堡Prolog标准以及Quintus和SICStusProlog的重要部分。与Ciao,YAP和GNU-Prolog的公平兼容性。虽然目标是尽可能保持兼容性,但SWI-Prolog故意偏离ISO标准以适应其他功能并与现代语言同步。阅读更多扩展和方向
·Comprehensivesetofbuilt-inpredicates,coveringPart1oftheISOstandard,thede-factoEdinburghPrologstandardandimportantpartsofQuintusandSICStusProlog.FaircompatibilitytoCiao,YAPandGNU-Prolog.Althoughtheaimistomaintaincompatibilitywhereverpossible,SWI-PrologdeliberatelydeviatesfromtheISOstandardtoaccommodateadditionalfunctionalityandsynchronisewithmodernlanguages.ReadmoreinExtensionsandDirections
1.4.6便携性Portability
适用于许多平台,包括几乎所有Unix/Linux平台,Windows,MacOSX(使用Xquartzforgraphics)WebAssembly(WASM),AndroidTermux等等。支持32位和64位硬件。SWI-Prolog已在许多CPU上进行编译和测试,例如x86,x64,SPARC,PowerPC,许多ARM型号。源是普通的C99,使用CMake自动配置(自版本7.7.20起)。对交叉编译的支持正在稳步提高。
与机器无关的保存状态(保存在一个平台上,使用另一个平台的虚拟机运行)。
Windows(32/64位)和MacOSX(64位)的常规二进制分发版和Ubuntu的PPA(稳定和开发)
·Portabletomanyplatforms,includingalmostallUnix/Linuxplatforms,Windows,MacOSX(usingXquartzforgraphics)WebAssembly(WASM),AndroidTermuxandmanymore.Both32-bitand64-bithardwareissupported.SWI-ProloghasbeencompiledandtestedonmanyCPUs,e.g.,x86,x64,SPARC,PowerPC,manyARMmodels.SourcesareplainC99,configuredautomaticallyusingCMake(asofversion7.7.20).Supportforcross-compilationissteadilyimproving.
·Machine-independentsaved-states(saveononeplatform,runusingthevirtualmachineofanotherplatform).
·RegularbinarydistributionsforWindows(32/64bits)andMacOSX(64bits))andPPAsforUbuntu(stableanddevelopment)
·Regulardistributionofthefullsourcepackages.ThesourcesarealsoaccessiblethroughGIT.
1.4.7法律Legal
SWI-Prolog以简化BSD许可证(也称为BSD-2许可证)分发。一些使用过的库和扩展包具有不同的许可条件。可以通过运行license/0来检查适用于正在运行的配置的许可证。请参阅许可证了解详情
·SWI-PrologisdistributedundertheSimplifiedBSDlicense,alsoknownastheBSD-2license.Someoftheusedlibrariesandextensionpackageshavedifferentlicenseconditions.Thelicensesapplicabletoarunningconfigurationcanbeexaminedbyrunninglicense/0.Seelicensefordetails.
Tagconfusingpageswithdoc-needs-help|Tagsareassociatedtoyourprofileifyouareloggedin
Tags:logintoaddanewannotationpost.loginPoweredbySWI-Prolog8.1.0-47-gc355e37
Prolog
文|百度百科,数据简化DataSimp20190126Sat
Prolog(ProgramminginLogic的缩写)是一种逻辑编程语言。它建立在逻辑学的理论基础之上,最初被运用于自然语言等研究领域。现已广泛的应用在人工智能的研究中,可以用来建造专家系统、自然语言理解、智能知识库等。同时对一些通常的应用程序的编写也很有帮助,能够比其他的语言更快速地开发程序,因为它的编程方法更像是使用逻辑的语言来描述程序。
Prolog图册
中文名:逻辑程序设计语言,外文名:Prolog,全称:ProgramminginLogic,分类:逻辑编程语言、理论基础、逻辑学、运用、自然语言等。
2.1简介
Prolog(ProgramminginLogic的缩写)是一种逻辑编程语言。它建立在逻辑学的理论基础之上,最初被运用于自然语言等研究领域。现已广泛的应用在人工智能的研究中,可以用来建造专家系统、自然语言理解、智能知识库等。同时对一些通常的应用程序的编写也很有帮助,能够比其他的语言更快速地开发程序,因为它的编程方法更象是使用逻辑的语言来描述程序。
2.2历史
Prolog语言最早由Aix-Marseille大学的AlainColmerauer与PhillipeRoussel等人于60年代末研究开发。1972年被公认为是Prolog语言正式诞生的年份,自1972年以后,分支出多种Prolog的方言。最主要的两种方言为Edinburgh和Aix-Marseille。最早的Prolog解释器由Roussel建造,而第一个Prolog编译器则是DavidWarren编写的。
Prolog一直在北美和欧洲被广泛使用。日本政府曾经为了建造智能计算机而用Prolog来开发ICOT第五代计算机系统。在早期的机器智能研究领域,Prolog曾经是主要的开发工具。
80年代Borland开发的TurboProlog,进一步普及了Prolog的使用。1995年确定了ISOProlog标准。
受Prolog影响的程序语言有很多,较为人所知的有:Mercury、Oz、Erlang、Strand。
目前比较流行的实现工具包括SWI-Prolog,Yap等。
2.3特点
1.prolog程序没有特定的运行顺序,其运行顺序是由电脑决定的,而不是编程序的人。
从这个意义上来说,prolog程序不是真正意义上的程序。所谓程序就是按照一定的步骤运行的计算机指令,而prolog程序的运行步骤不由人来决定。它更像一种描述型的语言,用特定的方法描述一个问题,然后由电脑自动找到这个问题的答案。举个极端的例子,你只需要把某个数学题目告诉它,它就会自动的找到答案,而不像使用其他的语言一样,必须人工的编制出某种算法。
2.prolog程序中没有if、when、case、for这样的控制流程语句
前面已经说了,程序的运行方式有电脑自己决定,当然就用不到这些控制流程的语句了。通常情况下,程序员不需要了解程序的运行过程,只需要注重程序的描述是否全面,不过prolog也提供了一些控制流程的方法,这些方法和其他语言中的方法有很大的区别,希望你在以后的学习当中能够融会贯通。
3.prolog程序和数据高度统一
在prolog程序中,是很难分清楚哪些是程序,哪些是数据的。事实上,prolog中的所有东西都有相同的形式,也就是说数据就是程序,程序就是数据。举一个其他语言的例子:如果想用c语言编写一个计算某个数学表达式的程序很简单(比如:a=2+5*4),因为这是一段程序。但是如果想编写一个计算用户输入的表达式的值的程序就很困难了。因为用户输入的是一段数据(字符串),如果想让c语言处理这个字符串,就需要很多方面的技术。则正是因为在c语言中,程序和数据是分开的。而在prolog就不存在这个问题,你甚至可以很轻松的编写处理其它prolog程序的程序。
4.prolog程序实际上是一个智能数据库
prolog的原理就是关系数据库,它是建立在关系数据库的基础上的。在以后的学习中你会发现它和SQL数据库查询语言有很多相似之处。使用prolog可以很方便的处理数据。
5.强大的递归功能
在其它的语言中,你也许已经接触过递归程序了。递归是一种非常简洁的方式,它能够有效的解决许多难题。而在prolog中,递归的功能得到了充分的体现,你甚至都会感到惊奇,递归居然有如此巨大的能力。
2.4语法示例
表示事实:
human(kate).
human(bill).
likes(kate,bill).
——表示kate和bill是人(human),kate喜欢bill;
表示规则:
friend(X,Y):-likes(X,Y),likes(Y,X).
——表示对于两个对象XY,如果X喜欢Y,且Y喜欢X,那么他们是朋友。
2.5范例
Quicksort
/*quicksort()中的第二个引数带有排序好的结果*/
/*仅为示范,若为gprolog使用者则用内建sort等较佳*/
/*在gprolog下之编译,例:gplc--min-sizequicksort.pl*/
/*执行quicksort2后会出现排序结果[2,9,18,18,25,33,66,77]*/
q:-L=[33,18,2,77,66,18,9,25],last(P,_),(quicksort(L,P,_),write(P),nl)./*加入last/2会在印P时没复合项*/
partition([],_,[],[])./*此行表空集亦视为分割(分割成空集与空集)*/
partition([X|Xs],Pivot,Smalls,Bigs):-/*原list分成Smalls与Bigs;此rule保证Smalls集
(X@
Smalls=[X|Rest],
partition(Xs,Pivot,Rest,Bigs)
;Bigs=[X|Rest],
partition(Xs,Pivot,Smalls,Rest)
).
quicksort([])-->[]./*表emptylist视为排序好的list*/
quicksort([X|Xs])-->/*此行相当于quicksort([X|Xs],Start,End):-此rule让Start为sortedlist*/
{partition(Xs,X,Smaller,Bigger)},/*由上行最左端元素为Pivot*/
quicksort(Smaller),[X],quicksort(Bigger)./*此行相当于quicksort(Smaller,Start,A),
A=[X|B],注意首字母大写者皆视为变数(list)
quicksort(Bigger,B,End).*/
:-initialization(q)./*启动q处goals*/
Sort
/*sortcsj.pl原始参考:ComputerScienceJ.GlennBrookshear*/
/*sortcsj()中的第二个引数带有排序好的结果*/
/*在gprolog下之编译,例:gplc--min-sizesortcsj.pl*/
/*执行sortcsj后会出现排序结果[2,9,18,18,25,33,66,77]*/
q:-L=[33,18,2,77,18,66,9,25],(sortcsj(L,P),write(P),nl).
sortcsj(L,S):-permutation(L,S),ordered(S)./*L为原list,S为排序好的list,此为permutation关系(built-in)*/
ordered([])./*表emptylist视为排序好的list*/
ordered([_|[]])./*只有一元素之list视为排序好的list*/
ordered([A|[B|T]]):-A=
Russell'sparadox
/*tstpx.pl*/
/*罗素佯谬(罗素悖论)(皇帝新脑罗杰.彭罗斯p.120)会导致不停机(使得gprolog产生stackoverflow)*/
/*在gprolog下之编译,例:gplc--min-sizetstpx.pl*/
q:-px(_)./*找寻任何可使px()rule成立的方式*/
px(1):-+px(1)./*规定此rule不成立。i.e.此rule为假时此rule才为真(佯谬)*/
:-initialization(q)./*启动q处goal*/
如何使用Prolog
一般而言,prolog作为数据或者逻辑处理程序而运行,配合其它程序如VC++、JAVA等的界面,由此实现带UI交互的“智能”软件,当然你所编辑出来的“智能”是软件,而不能说是真正意义的人工智能。上文说Prolog就是一个智能数据库,其实不然,Prolog主要是对数据进行一种关系描述,比如张三和李四是A关系,李四和王二是B关系,A关系==B关系,那么Prolog则擅长处理这种逻辑上的数据关系,不能和SQL混为一谈,所以说,Prolog的用途是来处理数据之间关系的,而不是存储数据本质的存在。
(注2:资料来自swi-prolog.org[7-8]和百度百科等[9]。词条标签:科技术语,科学。词条统计:浏览163103次,编辑21次历史版本,最近更新2018-10-07:monarch巨蟹。[9])
—END—
1.推理,《现代汉语词典第6版》第1323页.
2.[德]黑格尔,译者:梁志学.《逻辑学》.北京:人民出版社,2002:10-41.
3.刘颖,苏巧玲.《医学心理学》.北京:中国华侨出版社,1997:27-28.
(附PDF发“递归prolog简介”下载)
LIFE
Lifebeginsattheendofyourcomfortzone.——NealeDonaldWalsch
THEDAY
Thestrengthofpurposeandtheclarityofyourvision,alongwiththetenacitytopursueit,isyourunderlyingdriverofsuccess.——RagyTomas