数据简化DataSimp导读:在自然语言处理、知识工程和知识简化中,我们通过知识库来处理某些概念和实体关系,其中常用到递归。本文简单举例java递归和prolog最简单的递归编程代码。然后介绍统一化逻辑编程的高级计算机语言Prolog官网特征。下期继续介绍逻辑推理涉及到的基础概念,如逻辑学、逻辑推理、递归、递推、循环、迭代、遍历等;介绍其编程开发语言中的相应代码。

知识库递归编程java和prolog代码;逻辑语言Prolog简介(24555字)

A  逻辑学形式化及递归的prolog编程(4860字)

1. 逻辑学形式化方法简介

2. SWI-Prolog的递归

B  逻辑编程语言Prolog简介(18718字)

1. SWI-Prolog

参考文献(1227字)

Appx(1236字).数据简化DataSimp社区简介

A  逻辑学形式化及递归的prolog编程(4860字)

逻辑学形式化及递归的prolog编程

文|秦陇纪,数据简化DataSimp©Sat

1. 逻辑学形式化方法简介

逻辑学是研究思维的学科。思维有内容和形式两个方面。思维内容指思维所反映的对象及其属性;思维形式指用以反映对象及其属性的不同方式,即表达思维内容的不同方式。形式性上思维分:感性具象思维(感官感觉到的具体)、抽象逻辑思维(抽象概念为形式)、理性具象思维。从逻辑学角度看,抽象思维的三种基本形式是概念、命题和推理。逻辑和逻辑学的发展,经过了具象逻辑、抽象逻辑、对称逻辑(具象与抽象相统一)三大阶段。

1.1 形式化方法(formal methods)

形式化方法(formal methods)在逻辑科学中是指分析、研究思维形式结构的方法。它把各种具有不同内容的思维形式(主要是命题和推理)加以比较,找出其中各个部分相互联结的方式,如命题中包含概念彼此间的联结,推理中则是各个命题之间的联结,抽取出它们共同的形式结构;再引入表达形式结构的符号语言,用符号与符号之间的联系表达命题或推理的形式结构。

例如,把全称肯定命题,用符号形式化为“SAP”;把联言命题、假言命题分别形式化为:“p∧q、“p→q”。

又例如:一个具体的假言联言推理“如果这种金属是纯铝,那么它的物理性质必与纯铝相同;如果这种金属是纯铝,那么它的化学性质必与纯铝相同;但这种金属的物理性质和化学性质与纯铝不相同;所以,它不是纯铝。”

这个推理的形式结构是:“如果p,则q;如果p,则r;非q且非r;所以非p。”

可进而形式化为下列公式:((p→q)∧(p→r)∧┐q∧┐r→┐p。

从古至今,中国人的通病是不关心“推理”的内在意义,即其形式化逻辑的严谨性,而是按照名人名言做所谓的“语文引用推理”,极其幼稚肤浅。随着信息时代的发展,推理的意义逐渐地被扩大化,随意的语文滥用使其词义模糊、更加不严谨。推理的学术含义,即学术推理,来自于这个词的根本——它是理性世界的产物,是极符合科学的一种象征,不带一丝幻想,不带一点艺术感。它所要求的极严密的逻辑性,被学者们奉为是带动世界发展最有利的手段,是科学理论、哲学理论的基石。

描述逻辑是一种知识表示的形式化语言,是一阶逻辑的可判定子集。是否采用形式化方法,这是存在于广义语言逻辑与狭义语言逻辑之间的激烈论争。采用近世代数和时序逻辑的方法定义了形式化描述语言,并形式化地描述了密码协议的分层安全需求。

Description logic is a formal language for representingknowledge and it is a decidable subset of first-order logic. There is a heateddispute between the logic of language in broad sense and the one in narrowsense on the application of the method of formalization. Using temporal logicand algebra, a formal requirement language was presented and used to describethe formal hierarchy requirements for cryptographic protocols.

在思维推理过程中,常见演绎推理(Deductive Reasoning)、归纳推理(Inductive Reasoning)和类比推理(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) …….

编写代码(递归)

publicclass Fibonacci {

staticint fun(int n){

if(n == 1 || n == 2){

return fun(n-1) + fun(n-2) ;

publicstaticvoidmain(String[] args) {

for(int i = 1 ; i <= 15 ; ++i)

System.out.println(fun(i));

编写代码(递推)

static int fun2(int n){

int a[] = new int[20] ;

for(int i=3 ; i<=n ;i++){

a[i] = a[i-1] + a[i-2] ;

return a[n] ;

运行结果:

1.3.2 算法举例2

使用递归计算1+2+…+100 ;

分析:递归关系为f(n) = f(n-1)+ n ,递归出口为f(1) = 1 ;

编写代码(递归):

public class Sum {

static int fun(int n){

if( n == 1){

return fun(n-1) + n ;

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println(fun(100));

编写代码(递推)

static int fun2(int n){

int a[] = new int [200] ;

for(int i=2 ; i<=n ; i++){

a[i] = a[i-1] + i ;

return a[n] ;

运行结果:

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 ;

编写代码(递归):

public class Ladder {

static int fun(int n){

if(n == 1){

}else if(n == 2){

return fun(n-1) + fun(n-2) ;

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println(fun(5));

编写代码(递推):

static int fun2(int n){

int a[] = new int [200] ;

for(int i=3 ; i<=n ;i++){

a[i] = a[i-1] + a[i-2] ;

return a[n] ;

运行结果:

2. SWI-Prolog的递归

图1:分步阅读

Prolog是一门声明式编程语言,当你处理事物集合时,如列表或树,你会经常使用递归而不是迭代。递归是Prolog中最主要而又最难于掌握的概念之一,若要控制回溯度还与截断有关。

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! = n x(n - 1)!(递归定义)

转换成Prolog程序如下图所示:

在询问后,得到结果后按回车。运行结果如图所示。值得注意的是,在知识库中停止条件应该放在递归规则前面,这一点是至关重要的。因为如果不是这样,停止条件将永远不会满足。假如把规则放在停止条件前面,那么Prolog重复进入知识库时将首先遇到它,并与其进行匹配,即使是应满足停止条件时,也绝不会与停止条件匹配,从而引起无穷递归。

2.3 趁热打铁——斐波那契数列

数学的斐波那契数列是一个正整数数列,它与黄金比例有着密切的联系。该数列的下一个数是由其前面两个数相加得到的,头两个数均为1。该数列如下:

1,1,2,3,5,8,13,21,34,55,……

通式为:

f(1) = 1(两个停止条件)

f(n) = f(n-1) + f(n-2)(递归规则)

这里用Num1、Num2这两个变量分别来表示序数Num项的前面两项;变量Term1和Term2分别表示前两项斐波那契数的结果。来转换成Prolog程序如下图所示:

运行后的结果如下图所示。从截图可以看出,这些递归的程序还存在一些问题,比如在已经得出结果后,如果按“;”键试图查找另一个解时,会出现错误的答案,甚至开始报错。因为如果查找另一个结果,会重新进入递归条件,会再次减去数字,因而会报错。我将会在下次介绍Prolog的另一个机制——截断。

以上几个实例用于说明递归的Prolog程序。大多数较大的Prolog程序都可能包含递归,递归是大多数Prolog程序中的主要控制手段。

在编写递归程序时,应牢记下述几点:

❶所有递归规则都必须有停止条件,如果没有停止条件,递归规则将无止境地递归下去。

❷一般情况下,停止条件应该放在知识库中递归规则的上方。因为如果总找不到停止条件,也将导致无穷递归。

❸通常,在编写Prolog程序时应尽量采用递归,这要求自问如下问题:

➀是否可以把问题用其自身表达出来?

➁停止条件是什么?

总的来说,递归规则具有下列一般形式:

递归规则的停止条件.

递归谓词:-

某些初始计算,

递归谓词,

某些最终运算.

(注1:资料来自百度、CSDN等[4-6]。)

逻辑编程语言Prolog简介

文|swi-prolog.org,译|秦陇纪,数据简化DataSimp©Sat

介绍统一化的逻辑编程语言SWI-Prolog的主要特性,内容翻译自。

1.SWI-Prolog

News: SWI-Prolog on Android TermuxSearch Documentation:

Robust, mature, free. Prolog for the realworld.

Home/DOWNLOAD/DOCUMENTATION/TUTORIALS/COMMUNITY/USERS/WIKI

SWI-Prolog提供全面的免费Prolog环境。自1987年成立以来,SWI-Prolog开发一直受到现实世界应用需求的驱动。SWI-Prolog广泛用于研究和教育以及商业应用。加入已下载SWI-Prolog的超过一百万用户。更多 ...

SWI-Prolog offers acomprehensive free Prolog environment. Since its start in 1987, SWI-Prologdevelopment has been driven by the needs of real world applications. SWI-Prologis widely used in research and education as well as commercial applications.Join over a million users who have downloaded SWI-Prolog. more ...

Download  SWI-Prolog

Get Started

Try SWI-Prolog online

SEARCHDOCUMENTATION:Powered by SWI-Prolog 8.1.0-47-gc355e37

News: SWI-Prolog Class!Search Documentation:

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-Prologis a versatile implementation of the Prolog language. Although SWI-Prologgained its popularity primarily in education, its development is mostly drivenby the needs for application development. This is facilitatedby a rich interface to other IT components by supporting many document typesand(network) protocols as well as a comprehensive low-level interface to C thatis the basis for high-level interfaces to C++, Java(bundled), C#, Python, etc(externallyavailable). Data type extensions such as dictsand stringsas well as full support for Unicode and unbounded integers simplify smoothexchange of data with other components.

SWI-Prologaims at scalability. Its robust support for multi-threadingexploits multi-core hardware efficiently and simplifies embedding in concurrentapplications. Its Just In Time Indexing(JITI) provides transparent andefficient support for predicates with millions of clauses.

SWI-Prologunifies many extensions of the core language that have beendeveloped in the Prolog community such as tabling, constraints, globalvariables, destructive assignment, delimited continations andinteractors.

SWI-Prologoffers a variety of development tools, most of which may becombined at will. The native system provides an editor written in Prolog thatis a close clone of Emacs. It provides semantic highlighting based onreal time analysis of the code by the Prolog system itself. Complementary toolsinclude a graphical debugger, profiler and cross-referencer. Alternatively,there is a mode for GNU-Emacs and, Eclipse plugin called PDTand a VSC plugin,each of which may be combined with the native graphical tools. Finally, a computationalnotebook and web based IDE is provided by SWISH. SWISH is a versatile tool thatcan be configured and extended to suit many different scenarios.

SWI-Prologprovides an add-on distribution and installation mechanism called packs.A pack is a directory with minimal organizational conventions and a controlfile that describes the origin, version, dependencies and automatic upgradesupport. Packs can be installed from an archive, GIT repository or URL using pack_install/1.Packs are used to share code in the community. The pack system has grown acouple of eco systems for dealing with types, coroutining, etc.

1.2 服务器应用Server applications

SWI-Prolog配备了广泛的Web服务器(HTTP)框架,可用于提供(REST)服务和基于HTML5+CSS+JavaScript的最终用户应用程序。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-Prologis equipped with an extensive web server(HTTP) framework thatcan be used both for providing(REST) services and end-user applications basedon HTML5+CSS+JavaScript. Pengines(Prolog engines) allow clients to run queriesagainst a client-provided program on a remote server using a generic API. Suchprograms can be executed in a sandbox.

For(web)server support SWI-Prolog provides scalable multi threading.We measured an 80 times speedup running on a 128 core power pc system. Thisfeature makes SWI-Prolog attractive for CPU intensive server tasks wheremultiple clients require access to a large shared and possibly dynamic dataset.Note that many other high-level languages such as Python and Node.js only use asingle core and switch between tasks based on blocking I/O. This approachgenerally provides good resource usage for I/O intensive services with a highnumber of connections but a task blocking on a computation delays all otherclients. As SWI-Prolog's global garbage collectors_ for atoms andremoved dynamic clauses run fully asynchronous in a dedicatedthread, its(soft) real time behaviour is excellent.

SWI-Prologhas several unique features that reduce the need to restart servers for fixingbugs or injecting diagnostic code. Its incremental compilationcombined with generally local and backtrackable data structures(undo) allowsfor patching the program without restarting. SWI-Prolog allowsfor reloading running code from another thread safely, provided the signatureof the running predicates is not changed. This implies it is allowed to add,remove and modify clauses but it is not allowed to add, remove orreorder arguments. Still, this feature is valuable for hot-fixingservers or inject diagnostic code to a server withoutrestarting.

1.3 Prolog作为统一语言Prolog as unifying language

虽然Prolog被广泛认为是规则评估等任务的特殊用途语言,但我们认为它主要是一个适合用作各种组件间粘合的平台。其主要原因是数据是许多现代应用程序的核心,而数据的结构和存储种类繁多。诸如SQL,SPARQL,XPATH等经典查询语言只能处理一种这样的格式,而Prolog可以为这些格式提供简洁自然的查询语言,这些格式既可以直接执行,也可以编译成专用的查询语言表达式。Prolog的关系范式非常适合表格数据(RDBMS),而对递归代码的优化支持非常适合树形图形数据(RDF)。

Prolog是域特定语言(DSL)的合适语言。SWI-Prolog通过Prolog语言的语法扩展改进了这种支持。可以明确处理的有效语法的示例是[1][2],point{x:1, y:1}和function()。此外,准引用允许与任意语言的语法进行安全和清晰的集成。例如,以下语句指定了Prolog值X的安全插值的JavaScript片段。

{|javascript(X)||var x = X;|}

AlthoughProlog is widely recognised as a special purpose language for tasks suchas rule evaluation we consider it primarily a platform that is suitable to beused as glue between various components. The main reason for this isthat data is at the core of many modern applications whilethere is a large variety in which data is structured and stored. Classicalquery languages such as SQL, SPARQL, XPATH, etc. can each deal with one suchformat only, while Prolog can provide a concise and natural query language foreach of these formats that can either be executed directly or be compiled intodedicated query language expressions. Prolog's relational paradigmfits well with tabular data(RDBMS), while optimized support forrecursive code fits well with tree and graph shaped data(RDF).

Prologis a suitable language for Domain Specific Languages(DSL). SWI-Prologhas improved this support by syntactical extensions to the Prolog language.Examples of valid syntax that can be processed unambiguously are a[1][2],point{x:1,y:1} and function(). In addition, quasiquotations allow for safe and clean integration with the syntax ofarbitrary languages. For example, the following statement specifies a fragmentof JavaScript with a safe interpolation of the Prolog valueX.

{|javascript(X)||var x = X;|}

1.4 功能列表Feature list

以下列出了我们认为SWI-Prolog的主要功能以及相关文档的链接。

Belowis a list of what we consider key features of SWI-Prolog with links to therelevant documentation.

1.4.1 引擎Engine

•快速编译。例如,在14秒内从Prolog源加载WordNet 3.0或从快速加载文件格式加载0.4秒(参见qcompile/1)。WordNet源计数为821,515行。系统:Intel i7-3770上的Ubuntu 16.04,32Gb内存。

•强大且无内存泄漏。用于多个24x7运行的服务器(包括此Web服务)。

•小。完整的开发环境,包括图形,库和许多接口包,需要大约100MB的硬盘。内核大约是1.4MB(Ubuntu 16.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引擎。

•引擎,也称为交互器,提供协同程序,可用于状态累积和大规模并发,例如群体智能和模拟。

•定界延续是新控制结构和实现方面编程的强大构建块。

•Tabling(SLG分辨率)提供了更强大的解析技术,用于解决复杂相关规则上的查询并保证终止。

·      fast compilation. E.g., loads WordNet 3.0in 14 seconds from the Prolog source or 0.4 seconds from quick load fileformat(see qcompile/1).The WordNet source counts 821,515 lines. System: Ubuntu 16.04 on Intel i7-3770,32Gb memory.

·      Robust and free of memory leaks. In use for severalservers that run 24x7(including this web service).

·      Small. The full development environment, includinggraphics, libraries and many interface packages, requires approximately 100MBhard disk. The kernel is about 1.4MB(Ubuntu 16.04 .so file)

·      Scales well for large applications. No limits onprogram size, atom length, term arity or integer values. No performancedegradation on predicates with many(indexed) facts.

·      Just-In-Time indexing of both static and dynamic code on anyargument greatly simplifies handling multi-moded relations with many clauses.As of version 7.5, multi-argument JITI is supported. Thiscreates an index for the combined value of two arguments if there is noselective single-argument index. As of version 7.7 we also support indexing onthe arguments of compound terms. This feature notably improves the performancefor handling terminals in grammar rules(DCGs).

·      Unboundedinteger and rationalnumber arithmetic based on GMP library.

·      Thegoodies: modules(upward compatible to Quintus and SICStus), garbage-collection(transparentto C/C++-code, including atom and clause garbage collection), last-calloptimisation, dynamic expansion of the runtime stacks, exception-handling(includingC/C++ interface for both catching and throwing exceptions).

·      attributedvariables, coroutining(freeze/2,when/2,dif/2), global variables,cyclic terms.

·      Flag-controlledhandling of occurs-check(false/true/error) see current_prolog_flag/2. Efficient implementation of occurs checking thatonly verifies that new bindings do not introduce cycles.

·      UNICODE character set handling internal. Ideal for web andinternational applications.

·      Multi-threading support: run multiple pre-emptively scheduled prologengines on the same database.

·      Engines,also known as interactors provide coroutines that can be used forstate accumulation and massive concurrency for e.g., swarm intelligenceand simulations.

·      Delimited continuations is a powerful building block for new controlstructures and realise aspect programming.

·      Tabling(SLG resolution) provides a more robust resolution technique forsolving queries over complex interrelated rules with guaranteed termination.

1.4.2 约束处理Constraint handling

·      •CHR(约束处理规则),clp(FD),clp(R,Q)和其他各种库。

·      Librariesfor CHR(ConstraintHandling Rules), clp(FD),clp(R,Q)and various others.

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-Prologprovides extensive client and server libraries for HTTP. The HTTPserver framework deals with generating HTML, exchange of JSON or XML,authentication, sessions, and much more. Both client and server supports HTTPS.

·      Flexibleand fast interface to the C- and C++-language. The interfaceallows for calling both ways, handling of non-determinism both ways and embeddingof the SWI-Prolog kernel in C/C++ projects.

·      Interfacesto high level languages such as Java using JPL, Python and C# are available.

·      Databaseconnectivity is provided by the ODBCinterface.

·      Lowlevel network support includes sockets(both TCP and UDP), SSL and TIPC.

·      Librariesfor parsing and generating SGML/XML/HTML, JSONand YAML

·      LinkedData(RDF) support includes reading and writing many RDF formats(RDF/XML,Turtle, Ntriples, NQuads) and an efficient triple store. See the semwebpackage.

1.4.4 开发工具Development tools

•通过XPCE(Windows,Unix/Linux,MacOSX)支持图形的所有平台上的源级调试器。

•所有主要平台(Windows,Linux,MacOSX)的执行分析器(时间和呼叫统计)。

•交叉参考。gxref/0为可扩展的Prolog交叉引用器(外部参照)提供了图形前端。

•通过PlDoc识别编程支持。提供手册和应用程序文档的集成视图,并为您的应用程序生成LaTeX文档。

•通过PlUnit进行单元测试支持。

•SWISH提供了一个基于Web的平台,用于在协作环境中开发和运行Prolog代码。

·      Source-level debugger on all platforms that supports graphics through XPCE(Windows,Unix/Linux, MacOSX).

·      Executionprofiler(timeand call statistics) for all major platforms(Windows, Linux, MacOSX).

·      Cross-Referencer. gxref/0provides a graphical front-end for the extensible Prolog cross-referencer(xref).

·      Literateprogramming support through PlDoc.Provides integrated view on manual and application documentation and producingLaTeX documentation for your application.

·      Unittesting support through PlUnit.

·      SWISHprovides a web-based platform for developing and running Prolog code in acollaborative environment.

1.4.5 兼容性Compatibility

•全面的内置谓词集,涵盖ISO标准的第1部分,事实上的爱丁堡Prolog标准以及Quintus和SICStus Prolog的重要部分。与Ciao,YAP和GNU-Prolog的公平兼容性。虽然目标是尽可能保持兼容性,但SWI-Prolog故意偏离ISO标准以适应其他功能并与现代语言同步。阅读更多扩展和方向

·      Comprehensiveset of built-in predicates, covering Part 1 of the ISO standard, thede-facto Edinburgh Prolog standard and important parts of Quintus andSICStus Prolog. Fair compatibility to Ciao, YAP and GNU-Prolog. Although theaim is to maintain compatibility wherever possible, SWI-Prolog deliberatelydeviates from the ISO standard to accommodate additional functionality andsynchronise with modern languages. Read more in Extensionsand Directions

1.4.6 便携性Portability

•适用于许多平台,包括几乎所有Unix/Linux平台,Windows,MacOS X(使用Xquartz forgraphics)WebAssembly(WASM),Android Termux等等。支持32位和64位硬件。SWI-Prolog已在许多CPU上进行编译和测试,例如x86,x64,SPARC,PowerPC,许多ARM型号。源是普通的C99,使用CMake自动配置(自版本7.7.20起)。对交叉编译的支持正在稳步提高。

•与机器无关的保存状态(保存在一个平台上,使用另一个平台的虚拟机运行)。

•Windows(32/64位)和MacOS X(64位)的常规二进制分发版和Ubuntu的PPA(稳定和开发)

•定期分发完整的源包。这些来源也可通过GIT获取。

·      Portable to many platforms, including almost all Unix/Linuxplatforms, Windows, MacOS X(using Xquartz for graphics) WebAssembly(WASM),Android Termux and many more. Both 32-bit and64-bit hardware is supported. SWI-Prolog has been compiled andtested on many CPUs, e.g., x86, x64, SPARC, PowerPC, many ARM models. Sourcesare plain C99, configured automatically using CMake(as of version 7.7.20).Support for cross-compilation is steadily improving.

·      Machine-independentsaved-states(save on one platform, run using the virtual machine ofanother platform).

·      Regularbinary distributions for Windows(32/64 bits) and MacOS X(64 bits)) andPPAs for Ubuntu(stableand development)

·      Regulardistribution of the full source packages. The sources are alsoaccessible through GIT.

1.4.7 法律Legal

•SWI-Prolog以简化BSD许可证(也称为BSD-2许可证)分发。一些使用过的库和扩展包具有不同的许可条件。可以通过运行license/0来检查适用于正在运行的配置的许可证。请参阅许可证了解详情

使用doc-needs-help标记混淆页面|如果您已登录,则标记与您的个人资料相关联

标签:登录以添加新的注释帖子。登录由SWI-Prolog 8.1.0-47-gc355e37提供支持

·      SWI-Prologis distributed under the Simplified BSD license, also known as the BSD-2license. Some of the used libraries and extension packages have differentlicense conditions. The licenses applicable to a running configuration can beexamined by running license/0.See licensefor details.

Tag confusing pages withdoc-needs-help|Tags are associated to yourprofile if you are logged in

Tags: loginto add a new annotation post. loginPowered by SWI-Prolog 8.1.0-47-gc355e37

文|百度百科,数据简化DataSimp©Sat

Prolog(Programming in Logic的缩写)是一种逻辑编程语言。它建立在逻辑学的理论基础之上,最初被运用于自然语言等研究领域。现已广泛的应用在人工智能的研究中,可以用来建造专家系统、自然语言理解、智能知识库等。同时对一些通常的应用程序的编写也很有帮助,能够比其他的语言更快速地开发程序,因为它的编程方法更像是使用逻辑的语言来描述程序。

Prolog图册

中文名:逻辑程序设计语言,外文名:Prolog,全称:Programming in Logic,分类:逻辑编程语言、理论基础、逻辑学、运用、自然语言等。

Prolog(Programming in Logic的缩写)是一种逻辑编程语言。它建立在逻辑学的理论基础之上,最初被运用于自然语言等研究领域。现已广泛的应用在人工智能的研究中,可以用来建造专家系统、自然语言理解、智能知识库等。同时对一些通常的应用程序的编写也很有帮助,能够比其他的语言更快速地开发程序,因为它的编程方法更象是使用逻辑的语言来描述程序。

Prolog语言最早由Aix-Marseille大学的AlainColmerauer与PhillipeRoussel等人于60年代末研究开发。1972年被公认为是Prolog语言正式诞生的年份,自1972年以后,分支出多种Prolog的方言。最主要的两种方言为Edinburgh和Aix-Marseille。最早的Prolog解释器由Roussel建造,而第一个Prolog编译器则是 DavidWarren编写的。

Prolog一直在北美和欧洲被广泛使用。日本政府曾经为了建造智能计算机而用Prolog来开发ICOT第五代计算机系统。在早期的机器智能研究领域,Prolog曾经是主要的开发工具。

80年代Borland开发的Turbo Prolog,进一步普及了Prolog的使用。1995年确定了ISOProlog标准。

受Prolog影响的程序语言有很多,较为人所知的有:Mercury、Oz、Erlang、Strand。

目前比较流行的实现工具包括 SWI-Prolog, Yap 等。

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,那么他们是朋友。

/*quicksort2.pl,原始来源:*/

/*quicksort()中的第二个引数带有排序好的结果 */

/*仅为示范,若为gprolog使用者则用内建sort等较佳*/

/*在gprolog下之编译,例:gplc--min-size quicksort.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集<Pivot且Bigs集>=Pivot*/

(X @< Pivot ->

Smalls=[X|Rest],

partition(Xs,Pivot, Rest, Bigs)

;Bigs =[X|Rest],

partition(Xs,Pivot, Smalls, Rest)

quicksort([])-->[]./* 表empty list视为排序好的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*/

/*sortcsj.pl 原始参考:Computer Science J. GlennBrookshear */

/*sortcsj()中的第二个引数带有排序好的结果 */

/* 仅为示范,若为gprolog使用者则用内建sort等较佳 */

/* 在gprolog下之编译,例:gplc--min-size sortcsj.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([])./*表empty list视为排序好的list */

ordered([_|[]])./*只有一元素之list视为排序好的list */

ordered([A|[B|T]]):-A =< B, ordered([B|T])./* 此rule约束所谓的排序好是指前项元素小于或等于后一项元素 */

:-initialization(q)./*启动q处goals*/

Russell'sparadox

/*tstpx.pl */

/* 罗素佯谬(罗素悖论)(皇帝新脑罗杰.彭罗斯 p.120)会导致不停机(使得gprolog产生 stackoverflow) */

/* 在gprolog下之编译,例:gplc--min-size tstpx.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]。词条标签:科技术语,科学。词条统计:浏览次,编辑21次历史版本,最近更新2018-10-07:monarch巨蟹。[9])

免责说明:资料来自SWI-prolog/baidubaike/csdn。文章只为学术新闻信息传播,注明出处文字参考文献可溯源。本公众号不持有任何倾向性,亦不表示认可其观点或其所述。

转载本公号文章请注明出处、作者、时间等信息,如“此文转自©公号:数据简化DataSimp,作者:秦陇纪,时间:2016.3.15Tue”字样,详情邮件咨询QinD,转载请保留本信息。本公号保留相应版权,如有引文/译注/出处不明或遗漏/版权问题等,请给公号发留言或邮件到DataSimp@126.com。欢迎数据科学和人工智能学界、产业界同仁赐稿,投稿邮箱DataSimp@126.com,范围:AI/语言处理/数据/智能等科学技术论文。

数据DataSimp社区分享:信息与数据处理分析、数据科学研究前沿、数据资源现状和数据简化基础的科学知识、技术应用、产业活动、人物机构等信息。欢迎大家参与投稿,为数据科学技术做贡献,使国人尽快提高数据能力,提高社会信息流通效率。做事要平台,思路要跟进;止步吃住行,无力推文明。要推进人类文明,不可止步于敲门呐喊;设计空想太多,无法实现就虚度一生;工程能力至关重要,秦陇纪与君共勉之。

参考文献(1227字)

1. 推理,《现代汉语词典第6版》第1323页.

2. [德] 黑格尔,译者:梁志学.《逻辑学》.北京:人民出版社,2002:10-41.

3. 刘颖,苏巧玲.《医学心理学》.北京:中国华侨出版社,1997:27-28.

4. 叶清逸. 递推与递归.[EB/OL]; 网易智能, , 2018-06-02, visitingdata:2019-01-26.

7. baidujingyan. SWI-Prolog的递归.[EB/OL]; baidujingyan, ,2018-08-15, visiting data:2019-01-26.

9. SWI-Prolog. SWI-Prolog's features.[EB/OL]; SWI-Prolog,, visiting data:2019-01-26.

10. 最近更新:monarch巨蟹(2018-10-07). Prolog.[EB/OL]; baidubaike,, 2018-10-07, visiting data:2019-01-26.

知识库递归编程java和prolog代码;逻辑语言Prolog简介(24555字)

(附PDF发“递归prolog简介”下载)

秦陇纪©2010-2019数据简化DataSimp

简介:知识库递归编程java和prolog代码;逻辑语言Prolog简介。作者:秦陇纪。来源:SWI-prolog/baidubaike/csdn/数据简化社区/秦陇纪微信群聊公众号,参考文献附引文出处。公号输入栏发送关键字“递归prolog简介”或文末链接“阅读原文”可下载本文27k字12图16页PDF资料;点链接“数据简化DataSimp”关注后,菜单项有文章分类页。版权声明:科普文章仅供学习研究,公开资料©版权归原作者,请勿用于商业非法目的。秦陇纪2010数据简化DataSimp综合汇译编,投稿合作、转载授权/侵权、原文引文错误等请联系DataS沟通。主编译者:秦陇纪,数据简化DataSimp/科学Sciences/知识简化新媒体创立者,数据简化社区创始人,数据简化/知识简化概念和理论提出者,数据简化OS设计师/架构师,ASM/Cs/Java/Python/Prolog程序员,前英语/设计/IT教师。每天大量中英文阅读/设计开发调试/文章汇译编简化,时间精力人力有限,欢迎支持加入社区。社区媒体:“数据简化DataSimp、科学Sciences、知识简化”新媒体聚集专业领域一线研究员;研究技术时也传播知识、专业视角解释和普及科学现象和原理,展现自然社会生活之科学面。PhDS01秦陇纪发起,期待您参与各领域;欢迎分享、赞赏、支持科普~~

Appx(1236字).数据简化DataSimp社区简介

信息社会之数据、信息、知识、理论持续累积,远超个人认知学习的时间、精力和能力。必须行动起来,解决这个问题。应对大数据时代的数据爆炸、信息爆炸、知识爆炸,解决之道重在数据简化(Data Simplification):简化减少知识、媒体、社交数据,使信息、数据、知识越来越简单,符合人与设备的负荷。(秦陇纪,2010)

数据简化DataSimp年度会议(DS2010-2019),聚焦数据简化技术(Data Simplification Techniques):对各类数据从采集、处理、存储、阅读、分析、逻辑、形式等方面做简化,应用于信息及数据系统、知识工程、各类数据库、物理空间表征、生物医学数据,数学统计、自然语言处理、机器学习技术、人工智能等领域。欢迎数据科学技术、简化实例相关论文投稿加入数据简化社区,参加会议出版专著。请投会员邮箱DataS,详情访问社区网站。填写申请表加入数据简化DataSimp社区成员,应至少有一篇数据智能、编程开发IT文章:①原创数据智能科技论文;②数据智能工程技术开源程序代码;③翻译美欧数据智能科技论文;④社区网站发帖人管理员版主志愿者义工;⑤完善黑白静态和三彩色动态社区S圈型LOGO图标。DataSimplification/Sciences/Knowledge Simplification Public Accounts——DataS, 2018.12.12Wed,Xi'an, Shaanxi, China.

Life begins at the end of your comfortzone.——Neale Donald Walsch

The strength of purpose and the clarity ofyour vision,alongwith the tenacity to pursue it,is your underlying driver ofsuccess.——Ragy Tomas

(转载请写出处:©数据简化DataSimp2010-2018汇译编,欢迎技术、传媒伙伴投稿、加入数据简化社区!“数据简化DataSimp、科学Sciences、知识简化”投稿反馈邮箱DataS。)

转发/留言/打赏后“阅读原文”下载PDF