内部谓词

和其他语言一样,prolog也提供一些基本的输入输出函数。

内部谓词是指已经在prolog中事先定义好的谓词,在内存中的动态数据库中是没有内部谓词子句的。(当我们运行某个.pl 文件的时候,该文件的内容会加载到内存中。所以内存中会有文件中的谓词子句),当解释器遇到内部谓词的目标,它就直接调用事先定义好的程序。

内部谓词一般所完成的工作和逻辑无关,所以这些文词也叫做非逻辑谓词。虽然如此,但这些谓词也可以所谓prolog的目标,所以他们也有四个端口:call exit redo  fail

常用的输出谓词

write/1   %谓词名为 ‘write’  参数数量为 1 个

 ?- write('hello world').
hello world
true.

此谓词被调用是永远成功,它把它的参数作为字符串输出到屏幕上

当回溯时,它永远失败,所以,回溯不会吧已经输出到屏幕上的字符删掉

nl/

?- nl
. true.

此谓词没有参数,它的作用的在屏幕上输出一个回车符。

和write一样,从call端口嗲用时永远成功,但是回溯时总是失败。

tab/

?- write('hello'),tab(),write('world').
hello world
true.

此谓词有一个参数,该谓词的作用是在屏幕上输出n个空格 n=参数值

其控制流程和write nl一样

fail/

?- fail.
false.

该谓词没有参数,他的调用永远失败,从而引起回溯。

以前我们靠“;”来释放已经绑定的变量,进入目标的redo端口,变量的输出靠解释器完成,现在我们可以使用I/O谓词来显示变量。靠fail来引起自动回溯。

1 ?- location(X,kitchen),write(X),nl,fail.
apple
broccoli
crackers
false.

 该目标的运行流程如下:

 SWI-Prolog的debug信息如下:

?- location(X,kitchen),write(X),nl,fail.
T Call: () location(_G263, kitchen)
T Exit: () location(apple, kitchen)
T Call: () write(apple)
apple
T Exit: () write(apple)
T Call: () nl T Exit: () nl
T Call: () fail
T Fail: () fail
T Redo: () location(_G263, kitchen)
T Exit: () location(broccoli, kitchen)
T Call: () write(broccoli)
broccoli
T Exit: () write(broccoli)
T Call: () nl T Exit: () nl
T Call: () fail
T Fail: () fail
T Redo: () location(_G263, kitchen)
T Exit: () location(crackers, kitchen)
T Call: () write(crackers)
crackers
T Exit: () write(crackers)
T Call: () nl T Exit: () nl
T Call: () fail
T Fail: () fail
false.

我觉得教程中的debug信息更好,摘录如下:

localtion(X,kitchen),write(X),nl,fail.

call location(X,kitchen)
exit() location(apple,kitchen)
call write(apple)
apple
exit write(apple)
call nl %调用内部谓词 nl,会在屏幕上输出空格 exit nl
call fail
fail fail %fail 失败会引起自动回溯
redo nl %回溯到上一次成功匹配的子句,重新开始在该子句后面查找。I/O谓词应该就是重新运行
fail nl
redo write(apple)
fail write(apple)
redo location(X,kitchen)
exit() location(broccoli,kitchen)
call write(broccoli)
broccoli
exit write(broccoli)
call nl exit nl
call fail
fail fail
redo nl
fail nl
redo write(broccoli)
fail write(broccoli)
redo kitchen(X,kitchen)
exit() kitchen(crackers,kitchen)
call write(crackers)
crackers
exit write(crackers)
call nl exit nl
call fail
fail fail
redo nl
fail nl
redo write(crackers)
fail write(crackers)
redo location(X,kitchen)
fail location(X,kitchen)
no

那么如下子句执行的结果是什么呢?以及它的流程是如何进行的呢?

?- door(kitchen,R),write(R),nl,location(T,R),tab(),write(T),nl,fail.
?- door(kitchen,R),write(R),nl,location(T,R),tab(),write(T),nl,fail.
office
desk
computer
cellar
washing mechine %该结果中没有体现出 nl 这个内置谓词运行的结果——即没有回车符,但是在下面的debug信息中,却显示着,nl确实执行过。

如下为使用SWI-prolog的debug信息

 ?- door(kitchen,R),write(R),nl,location(T,R),tab(),write(T),nl,fail.
T Call: () door(kitchen, _G438)
T Exit: () door(kitchen, office)
T Call: () write(office)
office
T Exit: () write(office)
T Call: () nl T Exit: () nl
T Call: () location(_G442, office)
T Exit: () location(desk, office)
T Call: () tab() T Exit: () tab()
T Call: () write(desk)
desk
T Exit: () write(desk)
T Call: () nl T Exit: () nl
T Call: () fail
T Fail: () fail
T Redo: () location(_G442, office)
T Exit: () location(computer, office)
T Call: () tab() T Exit: () tab()
T Call: () write(computer)
computer
T Exit: () write(computer)
T Call: () nl T Exit: () nl
T Call: () fail
T Fail: () fail
T Redo: () door(kitchen, _G438)
T Exit: () door(kitchen, cellar)
T Call: () write(cellar)
cellar
T Exit: () write(cellar)
T Call: () nl T Exit: () nl
T Call: () location(_G442, cellar)
T Exit: () location('washing mechine', cellar)
T Call: () tab() T Exit: () tab()
T Call: () write('washing mechine')
washing mechine
T Exit: () write('washing mechine')
T Call: () nl T Exit: () nl
T Call: () fail
T Fail: () fail
false.

同样,我觉得SWI-prolog的debug信息不是很好,所以我就按照前几次的逻辑,自己写了下面这个debug信息(如有错误,请指出)

goal  door(kitchen,R),write(R),nl,location(T,R),tab(),write(T),nl,fail.

call door(kitchen,R)
exit() door(kitchen,office)
call write(office)
office
exit write(office)
call nl exit nl
call location(T,office)
exit(2) location(desk,office)
call tab()
exit tab()
call write(desk)
desk
exit write(desk)
call nl exit nl
call fail
fail fail
redo nl
fail nl
redo write(desk)
fail write(desk)
redo tab()
fail tab()
redo location(T,office)
exit() location(computer,office)
call tab()
exit tab()
call write(computer)
computer
exit write(computer)
call nl exit nl
call fail
fail fail
redo nl
fail nl
redo write(computer)
fail write(computer)
redo tab()
fail tab()
redo location(T,office)
fail location(T,office)
redo nl
fail nl
redo write(office)
fail write(office)
redo door(kitchen,R)
exit() door(kitchen,cellar)
call write(cellar)
cellar
exit write(cellar)
call nl exit nl
call location(T,cellar)
exit() location('washing mechine',cellar)
call tab()
exit tab()
call write('washing mechine')
washing mechine
exit write('washing mechine')
call nl exit nl
call fail
fail fail
redo nl
fail nl
redo write('washing meching')
fail write('washing meching')
redo tab()
fail tab()
redo location(T,cellar)
fail location(T,cellar)
redo nl
fail nl
redo write(cellar)
fail write(cellar)
redo door(kitchen,R)
fail door(kitchen,R)
no

其他内部谓词:

比较类:

、 =
等于 绑定变量
、 \=
不等于
、 >, <
大于,小于
、>= ,=<
大于等于, 小于等于
、 ==
强等于
 ?-  = .
true. ?- X = .
X = . ?- >.
false. ?- <.
true. ?- >=.
true. ?- == .
true.

表达式类

、is
X is Y , Y可以被实例化为表达式,该谓词先对Y 求值,得到一个整数,如X未实例化,
  则X 实例化为这一结果,且目标成功,否则,如X 已经实例化,那么 is 退化为 = 来判断成功与否
、+
加法运算
、 —
减法运算
、*
乘法运算
、/
除法运算
. mod
取模运算 优先级:
+—(正负号),mod,*/, +—(加、减)
?- X is .
X = . ?- S is +.
S = .

prolog 内部谓词的更多相关文章

  1. prolog 阶段总结

    http://blog.csdn.net/mwsong/article/details/1766382   到现在为止,我们已经对Prolog有了一个基本的了解,现在有必要对我们所学过的知识做一个系统 ...

  2. 七种Prolog解释器/编译器

    http://blog.sina.com.cn/s/blog_494e45fe0100lh1v.html PROLOG 人工智能领域常用的语言,开发自然语言分析,专家系统,以及所有和智能有关的程序,都 ...

  3. 人工智能技术导论——逻辑程序设计语言PROLOG

    最近在复习人工智能导论,里面介绍了一种逻辑关系语言PROLOG,但这本书里面用到的编译器是Turbo PROLOG,这个编译器早就被淘汰了,我后来找的了它的升级版Visual PROLOG,但一些语法 ...

  4. 一、prolog简介

    一般来说,人工智能语言应具备如下特点: 1.具有符号处理能力(即非数值处理能力): 2.适合于结构化程序设计,编程容易: 3. 具有递归功能和回溯功能: 4. 具有人机交互能力: 5. 适合于推理: ...

  5. Visual Prolog 的 Web 专家系统 (7)

    GENI核心 -- 推理引擎(1)知识表示 GOAL最后一句是谓语infer(),它的含义是"论证". 因此,,进GENI核心,执行视图推理引擎. infer() infer(): ...

  6. prolog 规则

    规则 规则由几个互相依赖的简单句(谓词)组成.用来描述事实之间的依赖关系,如:因果关系,蕴含关系,对应关系 规则的实质就是存储起来得查询 其语法结构如下: head:-body head 为谓词的定义 ...

  7. 让DB2跑得更快——DB2内部解析与性能优化

    让DB2跑得更快——DB2内部解析与性能优化 (DB2数据库领域的精彩强音,DB2技巧精髓的热心分享,资深数据库专家牛新庄.干毅民.成孜论.唐志刚联袂推荐!)  洪烨著 2013年10月出版 定价:7 ...

  8. SQL Server 内存中OLTP内部机制概述(一)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  9. GEOS库学习之三:空间关系、DE-9IM和谓词

    要判断两个多边形的关系,实际上属于几何图形空间关系判断.几何图形并不只有多边形一种,它包括点.线.面构成的任何图形,两两之间相互关系也有很多种,因此空间关系非常复杂.根据前人的研究,总结出了DE-9I ...

随机推荐

  1. MSSTDFMT.DLL无法注册的解决

    今天在使用Windows8的时候,发现了一个问题,当我想执行某个xxx.exe文件的时候,报的问题是MSSTDFMT.DLL无法注册. 但是我的系统又是64位的,那么可以这样操作: 从网上下载一个ms ...

  2. XPath Checker和Firebug安装与使用

    一.XPath Checker和Firebug简介 XPath Checker和Firebug是写爬虫过程中提取数据的非常有用的插件工具,直接打开火狐浏览器的菜单就可以下载 二.XPath Check ...

  3. IEnumerable<T>与IQueryable<T>以及.net的扩展方法

    首先看看继承关系 public abstract class DbSet : DbQuery public abstract class DbQuery : IOrderedQueryable, IQ ...

  4. 创建javascript对象的几种方式

    ECMAScript提供的对象有:String.Date.Array.Boolean.Math.Number.RegExp.Global 程序中需要用到很多自定义的js对象 1.直接创建 var ob ...

  5. 坑人的MyEclipse之-修改JSP页面的JavaScript背景颜色

    MyEclipse开发JSP页面时,如果要写JavaScript代码, 背景颜色默认是白色!效果如下: 这种反人类的设计我已经无力吐槽了!要改为黑色的话可以通过下面的方法设置:

  6. 成功部署SSIS中含有Oracle数据库连接的ETL包

    RT,正式写之前,我想说,真TMD不容易!!! 写博客,责任心,很重要 在百度搜出来的内地博客技术文章(CSDN.ITEYE.CNBLOGS……),大部分都是不全面,只针对一个遇到的问题点的记录,可以 ...

  7. 一次性插入多条sql语句的几种方法

    第一种:通过 insert select语句向表中添加数据 从现有表里面把数据插入到另外一张新表去前提必须先有test_2表的存在,并且test_2表中的列的数据类型必须和test表里面列的数据类型一 ...

  8. 详解rsync算法--如何减少同步文件时的网络传输量

    先看下图中的场景,客户端A和B,以及服务器server都保存了同一个文件,最初,A.B和server上的文件内容都是相同的(记为File.1).某一时刻,B修改了文件内容,上传到SERVER上(记为F ...

  9. Salesforce 数据清洗

    新系统上线后,需要导入历史数据,但是旧数据格式,数据缺失,数据错误,奇异值,属性归类与新系统有很大的gap.因此我们需要建立一套数据动态清洗规则给Salesforce系统,通过这些规则自动清洗导入数据 ...

  10. html, xhtml和xml

    html, xhtml和xml 1.定义及特点: 1) html:Hyper Text Markup Language 超文本标记语言 是最早写网页的语言,但编码不规范,主要用于控制数据的显示和外观. ...