知识库递归编程java和prolog代码;逻辑语言Prolog简介(附24555字PDF发“递归prolog简介”下载)

本文介绍了知识库编程中的递归概念,通过Java和Prolog代码示例阐述了递归在算法设计中的应用。此外,详细讲解了逻辑编程语言Prolog的递归特性,包括祖先后代查找、阶乘计算和斐波那契数列等问题的解决。文中还探讨了Prolog的历史、特点以及与其他编程语言的区别,强调了递归在Prolog中的核心地位和重要性。
摘要由CSDN通过智能技术生成

知识库递归编程java和prolog代码;逻辑语言Prolog简介(附24555字PDF发“递归prolog简介”下载)

数据简化DataSimp 今天

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

知识库递归编程javaprolog代码;逻辑语言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有两个子句。

如果一个规则由多个子句组成,那么其中一个子句为真,则这个规则为真。可以把子句间的逗号看成是条件“与”的关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值