java合一算法_Prolog语言的编译原理:合一算法
Prolog语言的编译原理:合一算法
分类:软考
|
更新时间:2016-07-08|
来源:转载
Prolog是一种基于谓词演算的程序设计语言。Prolog是一种说明性语言,它的基本意思是程序员着重于描述问题而不是指定一组指令来解决问题。Prolog程序是一组子句的集合,每个子句要么是事实要么是规则,子句表示属性或者个体之间的关系。
Prolog的语法和谓词演算的语法接近。例如,下面是一些事实的例子:
metal(copper) 铜是一种金属
likes(john,mary) John喜欢Mary
between(manchester,london,edinburgh) 曼彻斯特位于伦敦和爱丁堡之间
以上metal,likes等都叫做谓词。
Prolog中有常量和变量的区别,常量由小写字母开头,变量由大写字母开头。例如metal(copper)中copper是常量。
比如:parent(zhangsan,X),即zhangsan是X的双亲,此处zhangsan是常量,X是变量。
Prolog中有一个很重要的匹配的概念。比如,parent(zhangsan,X)与事实parent(zhangsan,zhangsi)匹配。
比如,有以下事实:
likes(john,mary)
likes(john,meg)
likes(david,mary)
而子句likes(john,X)则与上面的likes(john,mary),likes(john,meg)匹配。而likes(X,Y)与上面的四句都匹配,parent(zhangsan,X)与上面的四句都不匹配,因为谓词不同。
Prolog依靠这种匹配来对知识库中的知识进行搜索,在此基础上推理出新的事实。
这种匹配用一个专用术语叫做合一。合一有时候情况会比较复杂,比如,p(X,f(Y))与p(a,K)也是匹配的,因为K能与f(Y)匹配,X能与a匹配。path(X,Y)和path(X,Y,Z)不匹配,因为参数个数不同。mother(X,Y)和father(W,Z)不匹配,因为谓词名字不同等等。
判断两个句子是否匹配,可以做一个函数boolean unify()。在调用时,传递一个堆栈对象进去,堆栈中包含着要匹配的一对子句,返回值是true代表两子句匹配,false代表两子句不匹配。
在判断两子句匹配时,我们一般还要判断两个子句中,第一个子句中的哪个变量与第二个子句中相应位置的项匹配。例如,parent(zhangsan,X)与事实parent(zhangsan,zhangsi)匹配,则可以知道X与zhangsi匹配。又例如,likes(X,Y)与likes(john,meg)中,X与john匹配,Y与meg匹配。我们在调用unify(),在获得两子句是否匹配的信息时,同时,也将两子句中匹配的项,保存到“合一表”中。“合一表”可以使用list这种数据结构来保存。
判断匹配的伪代码如下:
while堆栈中不为空时
1,获得堆栈中的子句s1和s2
2,如果s1是变量,那么取得s1变量中的值,再赋给s1
3,如果s2是变量,那么取得s2变量中的值,再赋给s2
4,如果s1为null或者s2为null,或者s1和s2都是null,则return true,代表两个子句匹配。
5,如果s1和s2都是常量,而且s1不等于s2,那么return false,代表两个子句不匹配。
6,如果s1是变量而且s1与s2不同(这个不同指的是s1与s2不在同一个地址),那么将s1与s2添加进合一表中。
否则如果s2是变量而且s2与s1不同(这个不同指的是s1与s2不在同一个地址),那么将s1与s2添加进合一表中。
7,如果s1是一个子句,s2也是一个子句那么
a,如果s1的谓词不等于s2的谓词,则return false
b,如果s1的参数个数不等于s2的参数个数,则return false
将s1,s2中相应位置的参数,一对一对的,依次push进堆栈中.
end while
合一算法我是用java实现的,参考了Rob Callan的一书的c语言代码.其中,TestUnify.java是测试类,其他的,UT.java是合一表类,常量,变量,字句都有各自的类,这些项的基类是Exp类。 来源:教育联展网-软件水平考试
java合一算法_Prolog语言的编译原理:合一算法相关推荐
- c语言编译器下载 天天,简单C语言编译器(编译原理)
简单C语言编译器(编译原理) (26页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 #include#include#include# ...
- 编译原理lr(0)c语言,关于编译原理:LR(1)LR(0)文法判断?
"编译原理"是大学计算机类专业的一门主干课程.设置本课程的目的,在于系统的向学生讲述编译系统的结构.工程流程以及编译程序各组成部分的设计原理和实现技术,使学生通过本课程的学习,既掌 ...
- java pl0 四元式,【编译原理】c++实现自下而上语法分析及中间代码(四元式)生成...
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 编译实验 lr c语言代码,编译原理-实验5-LR(1)分析法
<编译原理-实验5-LR(1)分析法>由会员分享,可在线阅读,更多相关<编译原理-实验5-LR(1)分析法(6页珍藏版)>请在人人文库网上搜索. 1.编译原理实验报告项目名称 ...
- 编译原理算符分析器实现 -* c语言代码,编译原理论文-词法分析器的设计与实现...
<编译原理论文-词法分析器的设计与实现>由会员分享,可在线阅读,更多相关<编译原理论文-词法分析器的设计与实现(13页珍藏版)>请在人人文库网上搜索. 1.编译原理论文题 目 ...
- 基于c语言的编译原理课程设计,编译原理课程设计心得体会
与<编译原理课程设计心得体会>相关的范文 本文由leishensc贡献 doc文档可能在WAP端浏览体验不佳.建议您优先选择TXT,或下载源文件到本机查看. 2008-2009 学年第二学 ...
- c 语言编写编译原理语义分析实验,北邮 编译原理 语义分析实验报告
<北邮 编译原理 语义分析实验报告>由会员分享,可在线阅读,更多相关<北邮 编译原理 语义分析实验报告(14页珍藏版)>请在人人文库网上搜索. 1.编译原理第六章 语义分析目 ...
- rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)
原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...
- c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...
以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...
最新文章
- android万年历有什么作用,基于android的万年历农历怎么算
- 进程环境详解(四)---getenv、putenv和setenv函数详解
- Webpack不生成index.html
- 周记php,工作周记 | php外包与php技术服务商
- 用AJAX技术聚合RSS
- MySQL一主二从复制环境切换主从库
- 高等数学(工本)填空题
- isfile方法_递归算法是一种直接或者间接调用自身函数或者方法的算法
- Linux 下安装python3
- j2me on android,J2ME和Android的几个基本区别
- 【十次方】十次方项目介绍
- 如何做好罗斯蒙特流量计管理工作
- python 等值面_三维等值面提取算法(Dual Contouring)
- Google的“神秘链接”
- 河北安新复合型水稻 国稻种芯·中国水稻节:雄安生态示范区
- php publish,Laravel执行php artisan vendor:publish卡住问题解决方法
- 合唱队形(最大上升子序列)
- 使用PPT画图:浅尝辄止
- Java:初始Maven
- IMX6ULL裸机开发之点亮LED灯
热门文章
- 开放式社交网络(OSN网络)之一:一个大龄失业程序员
- 浙江大学计算机系81级同学会,耄耋之年再续深深同窗情——记浙江大学发电54级同学毕业60周年返校聚会...
- linux配额管理命令,【linux命令】linux 磁盘配额管理
- QuizCardGame
- 前端工程化掌握webpack极速配置技巧
- 单片机与电脑接口(TTL与RS232电平模拟转换)电路及工作原理分析
- 漫步青岛,24小时探索北方第三大城市
- CNN经典网络之残差网络(ResNet)剖析
- Druid sql injection violation, part alway false condition not allow
- RK3568+Codesys ARM+LINUX硬件平台的软PLC解决方案