知识库递归编程java和prolog代码;逻辑语言Prolog简介(附24555字PDF发“递归prolog简介”下载)
数据简化DataSimp 今天
数据简化DataSimp导读:在自然语言处理、知识工程和知识简化中,我们通过知识库来处理某些概念和实体关系,其中常用到递归。本文简单举例java递归和prolog最简单的递归编程代码。然后介绍统一化逻辑编程的高级计算机语言Prolog官网特征。下期继续介绍逻辑推理涉及到的基础概念,如逻辑学、逻辑推理、递归、递推、循环、迭代、遍历等;介绍其编程开发语言中的相应代码。
知识库递归编程java和prolog代码;逻辑语言Prolog简介(24555字)
目录
A 逻辑学形式化及递归的prolog编程(4860字)
1. 逻辑学形式化方法简介
2. SWI-Prolog的递归
B 逻辑编程语言Prolog简介(18718字)
1. SWI-Prolog
2. Prolog
参考文献(1227字)
Appx(1236字).数据简化DataSimp社区简介
A 逻辑学形式化及递归的prolog编程(4860字)
逻辑学形式化及递归的prolog编程
文|秦陇纪,数据简化DataSimp©20190126Sat
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){
return1 ;
}
else{
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] ;
a[1] = 1 ;
a[2] = 1 ;
for(int i=3 ; i<=n ;i++){
a[i] = a[i-1] + a[i-2] ;
}
return a[n] ;
}
运行结果:
1
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 ;
编写代码(递归):
public class Sum {
static int fun(int n){
if( n == 1){
return 1 ;
}else{
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] ;
a[1] = 1 ;
for(int i=2 ; i<=n ; i++){
a[i] = a[i-1] + i ;
}
return a[n] ;
}
运行结果:
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 ;
编写代码(递归):
public class Ladder {
static int fun(int n){
if(n == 1){
return 1 ;
}else if(n == 2){
return 2 ;
}else{
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] ;
a[1] = 1 ;
a[2] = 2 ;
for(int i=3 ; i<=n ;i++){
a[i] = a[i-1] + a[i-2] ;
}
return a[n] ;
}
运行结果:
8
2. SWI-Prolog的递归
图1:分步阅读
Prolog是一门声明式编程语言,当你处理事物集合时,如列表或树,你会经常使用递归而不是迭代。递归是Prolog中最主要而又最难于掌握的概念之一,若要控制回溯度还与截断有关。
2.1 牛刀小试——寻找祖先和后代的程序
安装好SWI-Prolog。我们先从这一个简单的例子来了解递归的性质吧。
在ancestor子句中的一个子句会使用ancestor子句。在这个例子中,ancestor(Z, Y)是一个递归的子目标。father 是实现递归子目标的核心事实。规则ancestor/2有两个子句。
如果一个规则由多个子句组成,那么其中一个子句为真,则这个规则为真。可以把子句间的逗号看成是条件“与”的关系